1

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

  1. 服务向 AlarmManager 注册 PendingIntent

  2. 当警报启动时, aReceiver接收到意图,并且(在某些条件下)调用startsActivity()my Main Activity,在清单中已声明为 android:launchMode="singleInstance". 请注意,要使此调用生效,传递的意图应具有Intent.FLAG_ACTIVITY_NEW_TASK

  3. 启动时,Main Activity稍微修改一下自身,并调用startActivityForResult一个我们将调用的 Activity WebviewActivity(因为它包含一个 webview,但这不是重点)

  4. 当用户完成与 , 的交互并WebViewActivitysetResult()finish()上被调用时,人们会期望 forMainActivity.onActivityResult()被调用。

但是当然这不会发生,正如这里的许多讨论中所记录的那样,原因显然是从 Activity 启动的singleInstanceActivity 在不同的 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);
 }
4

2 回答 2

1

我使用以下解决方法来解决此问题:

Activity 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 时,它会将广播发送给调用者。

希望这可以帮助

于 2014-10-25T18:25:22.867 回答
0

由于主要活动是一个单一的实例,正在做它被告知的事情。

所以是的,您必须从 Web Activity 启动 Main Activity 才能与任务执行保持一致

于 2013-10-18T10:22:27.103 回答