18

音楽プレーヤーであるアプリに通知アクション アイテムを追加しようとしています。ストリームが開始されると、通知がトリガーされ、ストリームの停止ボタンが通知に表示される必要があります。これまでのところ通知は正常に機能していますが、停止アクション アイテムに問題があります。ストリームを開始するサービスで宣言する方法は次のとおりです。

Intent stopIntent = new Intent(this, MusicPlayerNew.class);
stopIntent.putExtra("STOP", "STOP");
PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0,
                stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null);
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent);

アクティビティの onResume() メソッドで、「STOP」エクストラを getIntent().getStringExtra() でチェックしますが、getIntent() を介して取得したインテントにはエクストラが設定されていません:(

また、ブロードキャストを送信することを確認しようとしました(サービスからアクティビティに通信するために動作するブロードキャストレシーバーがあります)

Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER);
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0,
                stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 

これは、アクティビティが現在フォアグラウンドにある場合に機能します。アクティビティがバックグラウンドにある場合、停止ボタンは何もしません:(

編集: アクティビティに BroadcastReceiver をプライベート クラスとして持っています

private class DataUpdateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
..
}}

onResume() で、このレシーバーにアプリを登録します。

intentFilter = new IntentFilter(STOP_MEDIAPLAYER);
registerReceiver(dataUpdateReceiver, intentFilter);

onPause()

unregisterReceiver(dataUpdateReceiver);

onPause() メソッドから登録解除を削除すると、アプリ/アクティビティがフォアグラウンドになくてもブロードキャストが受信されます。しかし、これは正しい方法ですか?私はこの登録/登録解除のものをウェブ上のチュートリアルから入手したと思います..

4

10 に答える 10

17

これは非常に遅い答えですが、誰かを助けるかもしれません:

実行するインテントに基づいて、適切な種類の保留中のインテントを選択する必要があります。ここではいくつかの例を示します:

以下のアクティビティの使用:

Intent i = new Intent(this, YourActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);

以下のサービスを使用する場合:

Intent i = new Intent(this, YourService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);

ブロードキャスト レシーバーの場合は、以下を使用します。

Intent i = new Intent(this, YourReciver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

必要に応じて、リクエスト コードとフラグを変更する必要がある場合があります

于 2016-06-17T02:38:54.670 に答える
12

Google コードのこのスレッドで解決策を見つけましたhttps://code.google.com/p/android/issues/detail?id=61850

PendingIntent.FLAG_CANCEL_CURRENTそれを修正するには、にフラグを追加する必要がありますPendingIntent

PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0,
            stopIntent2, PendingIntent.FLAG_CANCEL_CURRENT);
于 2014-02-03T18:10:58.777 に答える
2

ブロードキャスト レシーバーを使用するだけでなく、サービスを使用して、次のようにサービスで新しいアクションを宣言する必要があります。

public final String ACTION_STOP = "yourpackagename.ACTION_STOP";

次に、次のようにインテントを作成します。

Intent stopIntent = new Intent(this, YourService.class).setAction(YourService.ACTION_STOP);
PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0);

もちろん、startCommandインテントのアクションが等しい場合は、サービスの関数で再生を停止しますACTION_STOP

これでうまくいくはずです;)

于 2013-04-29T18:51:08.167 に答える
0

私は非常に似た問題を抱えていましたが、解決策は非常に異なっていました。<service android:enabled="false"></service>manifest.xml ファイルで宣言した場合、保留中のインテントも起動されません。

android:enabled="false"からに置換android:enabled="true"

これは、問題の直接的な問題ではない可能性があります。ただし、デフォルトのテンプレートを使用して Android Studio でサービスを作成すると、これらのプロパティが自動的にサービスに追加されます。

于 2016-01-20T19:37:14.157 に答える
0

onPause で登録を解除しているため、バックグラウンドにあるときはブロードキャストを受信しません。unregisterReceiver コードを onDestroy 関数に移動します。これは、アクティビティが破棄されたときにのみ呼び出されます。または、予想されるイベントが発生したら、登録を解除できます。

于 2013-02-12T21:34:30.230 に答える
0

ここには複数の質問があります:

パート 1: インテントが「STOP」エクストラを受け取らないのはなぜですか? あなたが提供したコードには表示されていませんが、通知インテントにフラグ FLAG_ACTIVITY_SINGLE_TOP を使用しているかどうかを確認したかったのですか? その場合、アクティビティで受け取ったインテントはアクティビティを開始したインテントであるため、「STOP」エクストラは使用できません。onNewIntent()この場合 (新しいインテントが送信される場合)を拡張する必要があります。詳細はこちら
FLAG_ACTIVITY_SINGLE_TOP を使用していない場合は、通知がタップされたときに新しいアクティビティが作成されることを意味します。この場合、インテントには「STOP」パラメーターが必要です。関連するすべてのコードを提供していただければ、より適切なサポートを提供できます。

パート 2: ブロードキャスト レシーバーの使用 既にお気づきのように、これは単純ではありません。onDestroy で登録を解除する必要があります。アクティビティがユーザーによって閉じられた場合、onDestroy が呼び出され、ユーザーが通知をタップした時点でブロードキャスト レシーバーがアクティブでなくなる可能性があります。登録をまったく解除しない場合、動作しているように見えますが、これはメモリ リークです。GC はいつでもクリーンアップして、プログラムのクラッシュにつながる可能性があります。つまり、登録を解除する必要があります。ブロードキャスト レシーバーのアプローチを使用する必要がある場合は、これを行うためのサービスが必要であり、サービスには独自の落とし穴があります -> システムによる再起動、バッテリーの消耗など。最初のアプローチを使用することを強くお勧めします。

于 2013-04-30T03:16:44.523 に答える
0

私にとって、解決策はインテントのフラグを設定することでした:

resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                Intent.FLAG_ACTIVITY_CLEAR_TASK);
于 2016-04-20T14:27:24.360 に答える