我正在创建一个android应用程序,它具有以下执行流程:
服务使用AlarmManager
启动闹钟后,Receiver
会收到意图,并且(在某些条件下)为我的startsActivity()
调用Main Activity
,其中清单已被声明为android:launchMode="singleInstance"
。请注意,对于此调用工作,传递的意图应具有Intent.FLAG_ACTIVITY_NEW_TASK
启动后,Main Activity
会稍微修改一下,并为{@ 1}}调用一个活动,我们称之为startActivityForResult
(因为它包含一个网页浏览,但除此之外点)
当用户完成与WebviewActivity
的互动时,会在其上调用WebViewActivity
和setResult()
,并且可以预期finish()
被调用。
但是当然这不会发生,正如在这里的许多讨论中所记录的那样,显然是从MainActivity.onActivityResult()
活动启动的活动在不同的任务中运行的原因。
我认为解决方案是让singleInstance
改为WebActivity
。
问题是,有没有办法在正确的时间保持MainActivity
被调用?在这种情况下,从执行流程的起点开始哪些方面应该改变?
请注意,onActivityResult
不应同时拥有多个实例(它基本上是服务的接口),但如果其MainActivity
设置为launchMode
,接收方,因为需要standard
,所以会做到这一点。
FLAG_ACTIVITY_NEW_TASK
的宣言声明:
MainActivity
Receiver通过调用
启动 <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
答案 0 :(得分:1)
我对此问题使用以下解决方法:
活动A是来电者
活动B是我想要结果的singleInstance活动
在活动A中,我按如下方式注册广播接收器
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时,它将广播发送给调用者。 / p>
希望这有帮助
答案 1 :(得分:0)
由于主要活动是一个单一实例,正在做它已被告知的事情。
所以是的,您必须从Web活动启动主活动才能与任务执行保持一致