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,则返回数据全失败
综上:如果需要自己的Activity中开启系统照相机,然后返回数据,请自己的activity不要设置为singleInstance;如果非要是singleInstance,那就不能使用onActivityResult方式获取返回数据了;可以在保存照片后,从SD卡中获取图片。
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);
目标activity
@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, "没有时间");
}
}