簡體   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