2

実行中または実行中でない別のアクティビティにデータを送信するために使用している BroadcastReceiver があります。onReceive() メソッドでインテントを使用し、putExtra() でデータを入れています。データはアクティビティに送信されますが、アクティビティが既に実行されていてフォアグラウンドにある場合でも、アクティビティの onCreate() メソッドが呼び出されるため、新しいインスタンスを作成していると思います。onResume() のみを呼び出したい、またはインテントが存在しない場合はインテントを作成/開始し、存在する場合は「再開」する方法が他にあるかもしれません。現在、アクティビティが再作成されていますが、これは望ましくありません。

public void onReceive(Context context, Intent intent) {
            intent.setClass(context, MyActivity.class);
            intent.putExtra("message", "the data here");
            //intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Log.d("sending msg", "msg");    
            context.startActivity(intent);    
       }

FLAG_ACTIVITY_NEW_TASK を使用しない場合、RuntimeException がスローされます。具体的には、アクティビティではないものからアクティビティを開始する場合は、FLAG_ACTIVITY_NEW_TASK.

4

3 に答える 3

7

実行中の可能性のあるアクティビティを前面に出し、その上にある可能性のある他のアクティビティをすべて終了したい場合は、次のフラグを指定できます。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

この場合、このインテントを受け取るアクティビティが既に実行されている場合、onNewIntent()メソッドは最初から再作成されるのではなく、呼び出されます。

目的のアクティビティが実行されているときにアクティビティを単純に並べ替えたい (つまり、スタックの一番上に移動する) 場合は、次のことを試してください。

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
于 2012-04-13T15:07:18.850 に答える
1

BroadcastReceiver が取得していた解析済みの情報を (内部的に) 再ブロードキャストすることになりました。コード内のアクティビティは、イベントに登録され、プライベートに作成されたレシーバーに小さなハンドラー メソッドがありました。私の場合、このアクティビティは常に実行されていることがわかっているので、これは良い解決策でした。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        receiver = new BroadcastReceiver(){

            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("activity", "in local defined receiver");
                if(intent.getAction().equals(CustomInternalSendSmsAction) )
                {
                    handlePassedData(intent);               
                }
            }
        };
        this.registerReceiver(receiver, new IntentFilter(CustomInternalSendSmsAction));
}
于 2012-04-16T17:23:59.533 に答える
1

マニフェストのアクティビティ宣言に android:launchMode="singleTask" を追加するか、singleTask とまったく同じことを行うフラグ FLAG_ACTIVITY_NEW_TASK を使用してアクティビティ インテントを開始する必要があると思います

アクティビティがスタック内のどこかにすでに存在する場合は、onCreate() の代わりに onNewIntent() を呼び出して前面に移動します。

さまざまな起動モードを読み上げてください。非常に重要な基礎!:D http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

http://developer.android.com/guide/topics/manifest/activity-element.html

于 2012-04-13T15:09:26.707 に答える