[英]How to start same Activity with new data when android:launchMode=“singleInstance”?
[英]android : How to work around the fact that a singleInstance activity cannot expect to rely onActivityResult when starting subActivity?
我正在制作一個具有以下執行流程的android應用程序:
服務向AlarmManager注冊PendingIntent
發出警報時, Receiver
會收到此意圖,並(在某些條件下startsActivity()
為我的Main Activity
調用startsActivity()
,該startsActivity()
在清單中已聲明為android:launchMode="singleInstance"
。 請注意,要進行此調用,傳遞的意圖應具有一個Intent.FLAG_ACTIVITY_NEW_TASK
啟動后, Main Activity
會對其自身進行一些修改,並為Activity調用startActivityForResult
,我們將其稱為WebviewActivity
(因為它包含一個webview,但這並不重要)。
當用戶完成與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.