1

次の実行フローを持つ Android アプリケーションを作成しています。

  1. サービスは PendingIntent を AlarmManager に登録します

  2. アラームが起動されると、 aReceiverがインテントを受け取り、(いくつかの条件が与えられた場合) startsActivity()myMain Activityを呼び出します。これは、マニフェストで として宣言されてい android:launchMode="singleInstance"ます。この呼び出しが機能するためには、渡されたインテントにIntent.FLAG_ACTIVITY_NEW_TASK

  3. 開始すると、Main Activity自分自身を少し変更し、呼び出すstartActivityForResultアクティビティを呼び出しますWebviewActivity(これには webview が含まれているためですが、それは重要ではありません)。

  4. ユーザーが との対話を終了するとWebViewActivitysetResult()finish()が呼び出され、 が呼び出されることが予想さMainActivity.onActivityResult()れます。

ただし、ここでの多くの議論で文書化されているように、もちろんこれは起こりません。その理由は明らかに、アクティビティから起動されたsingleInstanceアクティビティが別のタスクで実行されるためです。

私が思う解決策は、代わりに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

この問題には次の回避策を使用します。

アクティビティ 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 アクティビティからメイン アクティビティを開始する必要があります。

于 2013-10-18T10:22:27.103 に答える