首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android :如何解决singleInstance活动在启动subActivity时不能期望依赖onActivityResult这一事实?

android :如何解决singleInstance活动在启动subActivity时不能期望依赖onActivityResult这一事实?
EN

Stack Overflow用户
提问于 2013-10-18 09:47:27
回答 2查看 1.7K关注 0票数 1

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

  1. 服务向PendingIntent注册AlarmManager
  2. 当警报启动时,Receiver接收到意图,并(在某些条件下)调用startsActivity() for MyMain Activity,清单中的Main Activity已声明为android:launchMode="singleInstance"。注意,要使此调用正常工作,传递的意图应该有一个Intent.FLAG_ACTIVITY_NEW_TASK
  3. 启动时,Main Activity对自己做了一些修改,并为一个活动调用了startActivityForResult,我们称之为WebviewActivity (因为它包含一个webview,但这不是重点)
  4. 当用户完成与WebViewActivity的交互时,就会调用setResult()finish(),人们会期望调用MainActivity.onActivityResult()

但当然不会发生这种情况,正如在这里的许多讨论中所记录的那样,原因显然是从singleInstance活动发起的活动在不同的任务中运行。

我认为一个解决方案是让WebActivity启动MainActivity

问题是,是否有一种方法可以在正确的时间调用onActivityResult?在这种情况下,从执行流开始的哪些方面应该改变?

请注意,MainActivity不应该同时具有多个实例(它基本上是服务的接口),但是如果它的launchMode设置为standard,则由于需要FLAG_ACTIVITY_NEW_TASK,接收方就会这样做。

MainActivity舱单声明

代码语言:javascript
复制
    <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启动

代码语言:javascript
复制
 onReceive(Context context, Intent intent) 
 {
     intent.setClass(context, MainActivity.class);
     int flag = Intent.FLAG_ACTIVITY_NEW_TASK;
     intent.setFlags(flag);
     context.startActivity(intent);
 }
EN

回答 2

Stack Overflow用户

发布于 2014-10-25 18:25:22

对于这个问题,我使用了以下解决方法:

活动A是调用者

活动B是我希望得到结果的singleInstance活动。

在活动A中,我注册广播接收器如下

代码语言:javascript
复制
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中,当需要发送我使用的数据时:

代码语言:javascript
复制
sendBroadcast("ActivityA_pick").putExtra("...data...");
finish();

这样,当我想从我自己的活动中得到一个结果时,我就能得到我想要的结果。如果您希望从系统或其他应用程序获得结果,您可以使用一个没有启动模式singleInstance的虚拟活动来调整这个结果,让它启动活动以获得结果,当它得到结果时,它会将广播发送给调用者。

希望这能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2013-10-18 10:22:27

作为主要的活动是一个单一的例子,是做它已被告知。

所以是的,您必须从Web活动开始主要活动,以便与任务执行保持一致

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19446562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档