android:如何解决singleInstance活动在启动subActivity时不能指望依赖onActivityResult的事实?

时间:2013-10-18 09:47:28

标签: android android-intent android-activity

我正在创建一个android应用程序,它具有以下执行流程:

  1. 服务使用AlarmManager

  2. 注册PendingIntent
  3. 启动闹钟后,Receiver会收到意图,并且(在某些条件下)为我的startsActivity()调用Main Activity,其中清单已被声明为android:launchMode="singleInstance"。请注意,对于此调用工作,传递的意图应具有Intent.FLAG_ACTIVITY_NEW_TASK

  4. 启动后,Main Activity会稍微修改一下,并为{@ 1}}调用一个活动,我们称之为startActivityForResult(因为它包含一个网页浏览,但除此之外点)

  5. 当用户完成与WebviewActivity的互动时,会在其上调用WebViewActivitysetResult(),并且可以预期finish()被调用。

  6. 但是当然这不会发生,正如在这里的许多讨论中所记录的那样,显然是从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

2 个答案:

答案 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活动启动主活动才能与任务执行保持一致