繁体   English   中英

android:如何解决启动subActivity时singleInstance活动不能期望依赖于ActivityResult的事实?

[英]android : How to work around the fact that a singleInstance activity cannot expect to rely onActivityResult when starting subActivity?

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

  1. 服务向AlarmManager注册PendingIntent

  2. 发出警报时, Receiver会收到此意图,并(在某些条件下startsActivity()为我的Main Activity调用startsActivity() ,该startsActivity()在清单中已声明为android:launchMode="singleInstance" 请注意,要进行此调用,传递的意图应具有一个Intent.FLAG_ACTIVITY_NEW_TASK

  3. 启动后, Main Activity会对其自身进行一些修改,并为Activity调用startActivityForResult ,我们将其称为WebviewActivity (因为它包含一个webview,但这并不重要)。

  4. 当用户完成与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM