web-dev-qa-db-ja.com

Android-ブロードキャストレシーバーからアプリを起動する

ブロードキャストレシーバーにアプリを次のように起動させたい:

  1. アプリがフォアグラウンドまたはバックグラウンドにない場合は、ランチャーから起動するかのように起動します。

  2. アプリがバックグラウンドにある場合は、最後にあった状態でアプリをフォアグラウンドに移動します。

  3. アプリがフォアグラウンドにある場合は、何もしません。

これが私のコードです:

@Override
public void onReceive(Context context, Intent intent) {
        Intent launch_intent = new Intent("Android.intent.action.MAIN");
        launch_intent.setComponent(new ComponentName("com.example.helloworld","com.example.helloworld.MainActivity"));
        launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        launch_intent.addCategory(Intent.CATEGORY_LAUNCHER);
        launch_intent.putExtra("some_data", "value");
        context.startActivity(launch_intent);
}

MainActivityは私のルートアクティビティです。私が言ったように、アプリがすでに実行されている場合は、状態を変更せずに前面に表示したいだけです。 MainActivityの上にアクティビティがある場合は、そのままにしておきます。

ほとんどの場合、上記のコードは正常に機能しましたが、アプリがバックグラウンドから取得されたときにアプリが再起動された(または状態がリセットされた---ルートがトップに戻った)ことに気付くことがありました。

どのコードを使用する必要がありますか?どんな助けでも大歓迎です!

9
Shawn

そのすべてのコードを書く必要はありません。次のように、「起動インテント」を使用できます。

PackageManager pm = context.getPackageManager();
Intent launchIntent = pm.getLaunchIntentForPackage("com.example.helloworld");
launchIntent.putExtra("some_data", "value");
context.startActivity(launchIntent);

ただし、コードも機能するはずです。

これがほとんどの場合機能すると言う場合は、厄介な古いAndroidバグが発生している可能性があります。これは、アプリを起動したときに発生します初回インストーラーから直接、またはIDE(Eclipse、Android Studioなど)経由)常にホーム画面またはインストールされているアプリのリストから直接アプリを初めて起動する必要があります。このイライラするAndroidバグの詳細については、 https://stackoverflow.com/ a/16474508/769265

9
David Wasser

あなたはのような行動が必要なので

1)アプリがフォアグラウンドまたはバックグラウンドにない場合は、ランチャーから起動するかのように起動します。

2)アプリがバックグラウンドにある場合は、最後にあった状態でアプリをフォアグラウンドに移動します。

3)アプリがフォアグラウンドにある場合は、何もしません。

考えてみましょう:

@Override
public void onReceive(Context context, Intent intent) {

    Intent startIntent = context
            .getPackageManager()
            .getLaunchIntentForPackage(context.getPackageName());

    startIntent.setFlags(
                    Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |
                    Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    );
    context.startActivity(startIntent);
}
4
Andrey
_@Override
public void onReceive(Context context, Intent intent) {
    Intent launch_intent = new  Intent(context, MainActivity.class);
    launch_intent.setComponent(new ComponentName("com.example.helloworld","com.example.helloworld.MainActivity");
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |INTENT.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    launch_intent.putExtra("some_data", "value");
    launch_intent.addCategory(Intent.CATEGORY_LAUNCHER);
    context.startActivity(launch_intent);
}
_

これは簡単ですが、インテントから追加のデータを取得しようとするときに適切な方法を知らない限り、通常はJava nullポインター例外が発生します。

onNewIntent()メソッドを使用して、追加のデータを受け取ります。以下のコメント方法を知りたい場合。

編集:以下を試してください。しかし、私が理解していないのは、私があなたに与えた最初のコードはそれ自体で動作するはずだということです。それはいつも私のために働いてきました。私が提供した最初のコードをコピーして、変更を加えずに貼り付けたことを確認しましたか?

Edit2:それが機能しない場合は、フラグを_INTENT.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED_ではなくclearTaskOnLaunchに設定してみてください

1
KISHORE_ZE

BroadcastReceiverをすでに知っていると仮定すると、通常どおりに起動する必要があります。 onReceive :したがって、次のようになります

@Override
public void onReceive(Context context, Intent intent) {
    Intent launch_intent = new Intent("Android.intent.action.MAIN");
    launch_intent.putExtra("some_data", "value");
    tiapp.startActivity(launch_intent);
}

以前に起動された場合は、そのアクティビティを再開するだけです。そうでない場合は、新しいアクティビティを開始します。

0
Sheychan