![](/img/trans.png)
[英]How to start same Activity with new data when android:launchMode=“singleInstance”?
[英]android : How to work around the fact that a singleInstance activity cannot expect to rely onActivityResult when starting subActivity?
我正在制作一个具有以下执行流程的android应用程序:
服务向AlarmManager注册PendingIntent
发出警报时, Receiver
会收到此意图,并(在某些条件下startsActivity()
为我的Main Activity
调用startsActivity()
,该startsActivity()
在清单中已声明为android:launchMode="singleInstance"
。 请注意,要进行此调用,传递的意图应具有一个Intent.FLAG_ACTIVITY_NEW_TASK
启动后, Main Activity
会对其自身进行一些修改,并为Activity调用startActivityForResult
,我们将其称为WebviewActivity
(因为它包含一个webview,但这并不重要)。
当用户完成与WebViewActivity
交互时,将在其上WebViewActivity
setResult()
和finish()
,并且期望可以调用MainActivity.onActivityResult()
。
但是,当然不会发生这种情况,正如此处许多讨论所记录的那样,原因显然是从singleInstance
Activity启动的Activity运行在不同的Task中。
我认为一个解决方案是让WebActivity
启动MainActivity
。
问题是,有没有办法维持在适当的时候调用onActivityResult
的方法? 在那种情况下,应该从执行流程的出发点改变哪些方面?
请注意, MainActivity
不应该在同一时间多个实例(这基本上是一个接口来服务),但如果它的launchMode
设置为standard
,接收器,因为的FLAG_ACTIVITY_NEW_TASK
所需,将做到这一点。
MainActivity
清单声明:
<activity android:name=".activities.MainActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
android:uiOptions=”splitActionBarWhenNarrow”
</activity>
接收器通过调用启动MainActivity
onReceive(Context context, Intent intent)
{
intent.setClass(context, MainActivity.class);
int flag = Intent.FLAG_ACTIVITY_NEW_TASK;
intent.setFlags(flag);
context.startActivity(intent);
}
我针对此问题使用以下变通办法:
活动A是呼叫者
活动B是我要从中获得结果的singleInstance活动
在活动AI中,按以下方式注册广播接收器
PickReceiver receiver=new PickReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("ActivityA_pick");
registerReceiver(receiver,filter);
class PickReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("ActivityA_pick")){
//get data from intent extras
}
}
在ActivityB中,当我要发送数据时:
sendBroadcast("ActivityA_pick").putExtra("...data...");
finish();
这样,当我希望从自己的活动之一获得结果时,便可以获得所需的结果。 如果要从系统或其他应用程序获得结果,则可以使用没有启动模式singleInstance的虚拟活动来调整此结果,让它启动结果的活动,并在获取活动的onActivityResult时将广播发送给调用方。
希望这可以帮助
由于主活动是单个实例,因此正在执行已告知的操作。
因此,是的,您必须从Web活动中启动Main Activity,以便与任务执行保持一致
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.