Android 以singleInstance模式加载的Activity怎么接收以putExtra方式传递过来参数
在开发中,我们经常会在AndroidManifest.xml中指定Activity的加载模式为singleInstance,方式如下:
[javascript] <activity android:name="ImgInfo" android:label="@string/app_name"
android:screenOrientation="portrait" android:launchMode="singleInstance">
</activity>
<activity android:name="ImgInfo" android:label="@string/app_name"
android:screenOrientation="portrait" android:launchMode="singleInstance">
</activity>
用如下方式打开Activity并传递参数:
[plain] Intent i = new Intent(this, ImgInfo.class);
i.putExtra("id", mPhotoId);
startActivity(i);
Intent i = new Intent(this, ImgInfo.class);
i.putExtra("id", mPhotoId);
startActivity(i);
如果不了解singleInstance的原理,我们想当然地会在Activity ImgInfo 的onCreate方法中写下如下的代码:
[plain] Bundle bud = getIntent().getExtras();
if (bud != null && bud.containsKey("id")) {
mPhotoId = bud.getInt("id");
}
Bundle bud = getIntent().getExtras();
if (bud != null && bud.containsKey("id")) {
mPhotoId = bud.getInt("id");
}
传递不同的id,你就会发现除了第一次能正确接收之外,其他的好像都不行了。需要怎么做呢?重写onNewIntent方法,基本代码如下:
[java] @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
InitArg();
}
private InitArg(){
Bundle bud = getIntent().getExtras();
if (bud != null && bud.containsKey("id")) {
mPhotoId = bud.getInt("id");
}
//其他操作
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
InitArg();
}
private InitArg(){
Bundle bud = getIntent().getExtras();
if (bud != null && bud.containsKey("id")) {
mPhotoId = bud.getInt("id");
}
//其他操作
}
这是为什么呢?这就需要深入了解Activity的加载机理及相关回调函数了。本博只记录工作中遇到的小问题,不阐述原理,如需要,请查询相关资料吧!
摘自 心灵净土
补充:移动开发 , Android ,