今天突然有人问到标题的问题。瞬间来了兴趣。居然还可以这么玩?查看了网上的介绍。原理上的东西都有。但是好多没有真正测试,都是一个乱写其他人转载,看样子他们也没测试啊。下面我就真正写一下这个程序。做一下总结:
一、实现原理:
图片显示是官方文档介绍,可以看到要调用onPause(),Activity必须Leavesforeground,查了下,好像是Activity必需离开Activity栈的栈顶,以上说法是别人的介绍。复制来的。
二、FirstAcitvity 通过第一个页面实现。
创建新的程序。命名为FirstActivity。
package co.example.demo; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class FirstActivity extends Activity implements android.content.DialogInterface.OnClickListener ,OnClickListener{ Dialog tel_dialog;// 打电话弹出框 TextView tv_dialog; TextView tv_intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("sunlei","FirstActivity---onCreate"); setContentView(R.layout.activity_main); tv_intent=(TextView) findViewById(R.id.tv_intent); tv_dialog=(TextView) findViewById(R.id.tv_dialog); tv_dialog.setOnClickListener(this); tv_intent.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.tv_dialog: AlertDialog.Builder builder = new Builder( FirstActivity.this);// 指当前的activity。如:A.this builder.setTitle("name"); builder.setMessage("测试"); builder.setPositiveButton("确定", FirstActivity.this); builder.setNegativeButton("取消", FirstActivity.this); tel_dialog=builder.create(); tel_dialog.show(); break; case R.id.tv_intent: Intent it=new Intent(FirstActivity.this,SecondActivity.class); startActivity(it); break; } } @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub if (which == -1) {// 确定 // 传入服务, parse()解析号码 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "")); //通知activtity处理传入的call服务 this.startActivity(intent); } if (which == -2) {// 取消 tel_dialog.dismiss(); } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.d("sunlei","FirstActivity---onStart"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d("sunlei","FirstActivity---onResume"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.d("sunlei","FirstActivity---onStop"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.d("sunlei","FirstActivity---onPause"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.d("sunlei","FirstActivity---onRestart"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d("sunlei","FirstActivity---onDestroy"); } }
程序在启动的时候,执行的生命周期是:
FirstActivity---onCreate
FirstActivity---onStart
FirstActivity---onResume
锁屏执行的生命周期是:
FirstActivity---onPause
FirstActivity---onStop
进入后台的快捷键操作执行生命周期:
FirstActivity---onPause
FirstActivity---onStop
好多人介绍当弹出Dialog 的时候可以出现标题的效果。
点击FirstActivity 的 弹出dialog按钮。弹出dialog.
发现 7个主要生命周期,一个也不走。根本没有效果。所以网上好多人根本没测试过。只是一味的转载。发现单个页面似乎实现不大可能!
三、通过SecondActivity来辅助实现。
新建Activity,命名为SecondActivity .
因为在Activity的跳转时候也会执行这个这些生命周期。所以新建第二个页面,让他从第一个页面Intent过来。首先执行正常流程:点击FirstActivity页面按钮从FirstActivity跳转到SecondActivity.执行生命周期:
FirstActivity---onPause
SecondActivity---onCreate
SecondActivity---onStart
SecondActivity---onResume
FirstActivity---onStop
发现此时依旧没有实现效果。
解决方案如下:
修改 AndroidManifest.xml中SecondAcitvity属性。
方案1:添加 android:theme="@android:style/Theme.Dialog" 。将Activity修改为Dialog样式。
生命周期执行过程:
FirstActivity---onPause
SecondActivity---onCreate
SecondActivity---onStart
SecondActivity---onResume
效果实现Ok了
方案2 :修改 AndroidManifest.xml中SecondAcitvity属性。android:theme="@android:style/Theme.Translucent"
生命周期执行过程:
FirstActivity---onPause
SecondActivity---onCreate
SecondActivity---onStart
SecondActivity---onResume
效果实现Ok了
但是第二个页面是完全透明度。什么用?实际业务场景真的会用到吗