android:launchMode="standard":这种启动模式下,每startActivity()一次,即在内存中创建一个新实例。
android:launchMode="singleTop":如果在栈的顶端有该activity的引用存在,则再一次startActivity()不会onCreate创建新的,而是复用存在的实例,调用onNewIntent()方法。
android:launchMode="singleTask":只要整个栈中有该activity的引用存在,则再一次startActivity()不会onCreate创建新的,而是复用存在的实例,调用onNewIntent()方法。
android:launchMode="singleInstance":第一次创建后,即另开启一个任务栈,并且该新栈只能存在它的一个引用;再一次startActivity()不会onCreate创建新的,而是复用存在的实例,调用onNewIntent()方法。
再来看看startActivityForResult()方法:(亲测)
现在演示:A startActivityForResult()开启B,然后B返回数据;
如果A为standard B为singleTask、singleInstance,返回失败;A调用startActivityForResult()开启B后,会立即调用A的onActivityResult();此时B操作数据没有返回(还没获取) B为singleTop和standard都正常返回数据。 如果A为singleTop 同上 如果A为singleTask 同上 如果A为singleInstance,则返回数据全失败
setResult()方法在onPause、onDestory()中执行是无效的。其它生命周期方法中执行有效。
每按一次后退键,都会调用onDestory();
调用this.finish(),会自动调用onDestory();
通知点击,传的intent值,进入目标Activity时,会调用onNewIntent()方法,只要该activity不为singleInstance,intent带的值都能取到。
Intent intent = new Intent(ctx, MainActivity.class); intent.putExtra("time", time); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, intent, 0);
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Logger.d(TAG, "MainActivity onNewIntent"); String time = intent.getStringExtra("time"); Logger.d(TAG, "onNewIntent time: "+time); if(!TextUtils.isEmpty(time)){ Logger.d(TAG, "time: "+time); //经营数据 mTabHost.setCurrentTab(0); rb_main_data.setChecked(true); //设置已读 PushMsgDao dao = new PushMsgDao(this); SystemMessage systemMessage = dao.findMsgByTime(time); dao.setReaded(systemMessage.getId()); }else{ Logger.d(TAG, "没有时间"); } }