0

私はBroadcastReceiver内部サービスを持っています:

public class NotificationClickService extends Service {

    private static final String DEBUG_TAG = "NotificationClickService";

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        registerReceiver(NotificationClickReceiver, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
    }

    @Override
      public void onDestroy() {
        unregisterReceiver(NotificationClickReceiver);
    }

    BroadcastReceiver NotificationClickReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(DEBUG_TAG, "NotificationClickReceiver: onReceive CALLED");

                Intent i = new Intent(android.app.DownloadManager.ACTION_VIEW_DOWNLOADS);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                        Intent.FLAG_ACTIVITY_SINGLE_TOP | 
                        Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                        Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                context.startActivity(i);
        }
    };
}

これにより、システムのダウンロード マネージャーが前面に表示されます。

私の電話では、JellyBean ベースの CyanogenMod 10.1 を実行しています。

しかし...

システム アプリ CMupdater が起動するとすぐに:

  • CMupdaterが現在実行されている場合、; の代わりに、サービスの BroadcastReceiver から呼び出されますDownloadManager
  • CMupdaterが実行されていないが、少なくとも 1 回は実行されている場合、レシーバーはまったく呼び出されません。

再起動してアップデーターを実行しないと、再び機能します。対応するCyanogenMod 10.1バージョンを使用して、私のタブレットでもすべてテストされました。

これはCMの受信機からです:

package com.cyanogenmod.updater.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import com.cyanogenmod.updater.UpdatesSettings;

public class NotificationClickReceiver extends BroadcastReceiver{
     private static String TAG = "NotificationClickReceiver";

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

         // Bring the main app to the foreground
         Intent i = new Intent(context, UpdatesSettings.class);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
                 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         context.startActivity(i);
     }
 }

そしてそのマニフェストから:

    <receiver android:name="com.cyanogenmod.updater.receiver.NotificationClickReceiver">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            <category android:name="android.intent.category.HOME"/>
        </intent-filter>
    </receiver>

android.intent.action.DOWNLOAD_NOTIFICATION_CLICKEDDownloadManager.ACTION_NOTIFICATION_CLICKED私が使用したインテントの定数値です。

4

2 に答える 2

0

私はまだあなたの質問を解読するのに苦労していますが、あなたの受信者がどのように呼び出されたのかわかりません. インテント フィルターにカテゴリ登録がありません。

試す:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED); 
filter.addCategory(Intent.CATEGORY_HOME);
registerReceiver(NotificationClickReceiver, filter);

これにより、マニフェストに登録された受信者と同じブロードキャストを常に受信できるようになります。

于 2013-02-25T14:14:23.877 に答える
0

すべての一致BroadcastRecieversは、適切な とともに通知されますContext。これは、次の 2 つの方法で発生する可能性があることに注意してください。

  1. 受信者がコードでローカルに作成され、オブジェクト内に登録されている場合、そのオブジェクトが周囲にある場合にのみ呼び出されます。

  2. マニフェストでReciever が宣言されている場合、そのオブジェクトが作成され、onReceive()メソッドが呼び出されます。

そのため、Service クラスに を実装さBroadCastRecieverせ、マニフェスト ファイルで宣言し、そのonRecieve();からサービスを開始できます。

于 2013-02-25T14:15:18.043 に答える