我在服务中有一个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没有运行,但至少运行了一次,则根本不会调用我的接收器
如果我重新启动并且不运行更新程序,它会再次工作。所有测试也在我的平板电脑上与相应的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_CLICKED
是我使用的DownloadManager.ACTION_NOTIFICATION_CLICKED
意图的常数值。
虽然我仍然很难破译你的问题,但我不知道你的接收器是如何被调用的。您的意向过滤器中缺少类别注册。
尝试:
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);
filter.addCategory(Intent.CATEGORY_HOME);
registerReceiver(NotificationClickReceiver, filter);
这应该确保您始终接收到与清单注册接收器相同的广播。
将通知所有匹配的BroadcastRecievers
及其相应的Context
。请注意,这可能通过两种方式发生:
-
如果Receiver是在代码中本地创建并在某个对象内部注册的,则只有当该对象在附近时才会调用它。
-
如果在清单中声明了Reciever,则将创建该对象并调用
onReceive()
方法。
因此,您可以让Service类实现BroadCastReciever
,在Manifest文件中声明它,并从它的onRecieve()
开始您的服务;