Android--生命周期和启动模式

onCreate 在活动第一次被创建的时候调用
退出程序
onPause 暂定, 在系统准备去启动or恢复另一个活动的时候调用
onDestroy 活动被销毁之前调用,之后活动变销毁状态

再次进入程序主界面
onStart 活动由不可见变为可见的时候调用
onResume 在准备好和用户进行交互的时候调用

进入dialog界面
onPause 这里是暂定主页面的活动
退出dialog
onRestart 在活动由停止状态变运行状态前调用,这里应该是调用主界面
onStart start主界面
onResume

进入normal界面
onPause 暂停情况下的活动是有可能被回收的

退出normal界面
onRestart
onStart
onResume

退出程序
onDestroy

用户进入A,通过A进入B,A暂停时候被回收掉了,B从A返回A
A会onCreate(而不是 onRestart),为了将A的临时数据保存,
需要使用回调方法 onSaveInstanceState()

public class NormalActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.normal_layout);}
}
public class MainActivity extends AppCompatActivity {

    public  static  final String TAG ="MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startNormalActivity =(Button)findViewById(R.id.start_normal_activity);
        Button startDialogActivity =(Button)findViewById(R.id.start_dialog_activity);

        startNormalActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                startActivity(intent);
            }
        });

        startDialogActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DialogActivity.class);
                startActivity(intent);
            }
        });

        Log.d(TAG,"onCreate  Main");
    }
        @Override
        protected void onStart(){
            super.onStart();
            Log.d(TAG,"onStart");
        }
        @Override
        protected void onResume(){
            super.onResume();
            Log.d(TAG,"onResume");
        }
        @Override
        protected void onPause(){
            super.onPause();
            Log.d(TAG,"onPause");
        }
        @Override
        protected void onDestroy(){
            super.onDestroy();
            Log.d(TAG,"onDestroy");
        }
        @Override
        protected void onRestart(){
            super.onRestart();
            Log.d(TAG,"onRestart");
        }


}
public class DialogActivity extends AppCompatActivity {
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_layout);}

}

standard启动模式

com.sqh.courselife.FirstActivity@eea6364

add activity client record, r= ActivityRecord{ccc7ca9 token=android.os.BinderProxy@10c3b8 {com.sqh.courselife/com.sqh.courselife.FirstActivity}} token= android.os.BinderProxy@10c3b8

启动FirstActivity 出现上述 ,再点击按钮,事件为从FirstActivity转到FirstActivity

2021-08-12 20:11:12.529 8305-8305/com.sqh.courselife D/FirstActivity: com.sqh.courselife.FirstActivity@e604e90
2021-08-12 20:11:12.546 8305-8305/com.sqh.courselife D/ActivityThread: add activity client record, r= ActivityRecord{39d4cee token=android.os.BinderProxy@117bb8d {com.sqh.courselife/com.sqh.courselife.FirstActivity}} token= android.os.BinderProxy@117bb8d

即重新再建一个实例入栈,如果要回到主界面,需要按返回键2次

Single Top启动模式(解决重复栈顶创建问题)

如果发现返回栈顶的活动(即将要执行的活动、呈现的页面)为当前页面,那么就不会再创建

新的实例,直接使用当前的。

具体做法为在活动注册文件, 对象的活动 中写上

android:launchMode=“singleTop”.

但是如果A是暂停状态,我们由B转到A活动时(未转的时候栈顶为B), A实例还是会再次新建

SingleTask

使程序上下文只存在一个唯一的实例

android:launchMode=“singleTask”.

singleInstance

会返回一个新的返回栈来管理这个重复的活动,

应用场景:X程序里的a活动需要被A,B,C等很多程序调用

那么把a活动设定为 singleInstance,A调用a的时候,程序A单独开个栈来接受他

B也单独开个栈来管理a,C同理。

如果一个程序里其他b,c,d活动调用a,也会分别创建栈,但浪费资源,因为

多创建了无用的栈和重复的活动a,这种情况最好用SingleTask,全文只有一个实例,

占用资源少,但功能一样,

举例:运行程序进入

FirstActivity,再进入SecondActivity,再进入ThirdActivity

通过getTaskId 在Log打印内容如下

171

172

171

看出活动1,3在同一个栈,活动2在栈172,不是同一个。

然后在活动3点back,会直接回到活动1(原因也很明显,活动3从栈171移开

当前171的栈顶自然为活动1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值