启动后不显示使用 Remoteview 的自定义通知
Custom Notification using Remoteview not showing after Boot
我在我的应用程序中显示自定义通知,它工作正常,但我想在设备启动后启动此通知,但此时它生成错误
错误Logcat:
01-17 20:29:40.281 1652 1785 W PackageManager: Failure retrieving resources for com.ltlgen.guest_mode: Resource ID #0x0
01-17 20:30:42.721 1070 1629 D ActivityManager: startProcessLocked calleePkgName: com.ltlgen.guest_mode, hostingType: broadcast-2
01-17 20:30:42.781 1070 1629 I ActivityManager: Start proc 6558:com.ltlgen.guest_mode/u0a188 for broadcast-2 com.ltlgen.guest_mode/.BootReceiver
01-17 20:30:42.971 6558 6558 W ResourcesManager: getTopLevelResources: com.ltlgen.guest_mode for user 0
01-17 20:30:42.991 6558 6558 D InjectionManager: fillFeatureStoreMap com.ltlgen.guest_mode
01-17 20:30:43.001 6558 6558 I InjectionManager: Constructor com.ltlgen.guest_mode, Feature store :{}
01-17 20:30:43.001 6558 6558 D guest_mode.BootReceiver: android.intent.action.BOOT_COMPLETED
01-17 20:30:43.091 6558 6558 E AndroidRuntime: Process: com.ltlgen.guest_mode, PID: 6558
01-17 20:30:43.091 6558 6558 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.ltlgen.guest_mode.BootReceiver: java.lang.IllegalArgumentException: No such package
01-17 20:30:43.091 6558 6558 E AndroidRuntime: at com.ltlgen.guest_mode.MainActivity.handleNotification(MainActivity.java:149)
01-17 20:30:43.091 6558 6558 E AndroidRuntime: at com.ltlgen.guest_mode.BootReceiver.onReceive(BootReceiver.java:16)
01-17 20:30:43.291 1070 1102 D StatusBarManagerService: manageDisableList userId=0 what=0x0 pkg=Window{4ea5511 u0 Application Error: com.ltlgen.guest_mode}
01-17 20:30:45.331 1070 1692 I ActivityManager: Process com.ltlgen.guest_mode (pid 6558)(adj 15) has died(34,451)
错误:第 149 行没有这样的包
这是第 149 行
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification);
完整方法代码如下
public void handleNotification()
{
int mId = 22120927;
boolean active = isNotificationActive();
PendingIntent pi = PendingIntent.getService(mContext, 0, new Intent(mContext, MainService.class), PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder n = new NotificationCompat.Builder(mContext);
n.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher);
if (DEBUG_MODE)
{
n.setPriority(NotificationCompat.PRIORITY_MIN);
}
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification);
view.setOnClickPendingIntent(R.id.notificationImageButton1, pi);
n.setContent(view);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (active)
{
mNotificationManager.notify(mId, n.build());
}
else
{
mNotificationManager.cancel(mId);
}
}
BootReceiver.xml
MainActivity main = new MainActivity();
main.handleNotification();
main.finish();
AndroidManifest.xnl
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:resizeableActivity = "true">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DialerActivity"
android:label=""
android:windowSoftInputMode="stateVisible" />
<service android:name=".MainService" />
<receiver
android:name=".BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
在@Mike M 的评论帮助下我的问题已经解决了
GetPackageManager() 需要在创建 MainActivity 时未初始化的上下文 class 从 BootReceiver 手动实例化
现在,我在 MyNotificationManager class 中单独处理通知,如下所示:
public class MyNotificationManager
{
private Context mContext;
SharedPreferences mShPrefs;
SharedPreferences.Editor mShPrefsEditor;
private static final String KEY_NOTIFICATION_STATUS = "notification_status";
public MyNotificationManager(Context context)
{
mContext = context;
mShPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mShPrefsEditor = mShPrefs.edit();
}
public void handleNotification()
{
int mId = 22120927;
boolean active = isNotificationActive();
PendingIntent pi = PendingIntent.getService(mContext, 0, new Intent(mContext, MainService.class), PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder n = new NotificationCompat.Builder(mContext);
n.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher);
if (MainActivity.DEBUG_MODE)
{
n.setPriority(NotificationCompat.PRIORITY_MIN);
}
RemoteViews view = new RemoteViews(mContext.getPackageName(), R.layout.notification);
view.setOnClickPendingIntent(R.id.notificationImageButton1, pi);
n.setContent(view);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (active)
{
mNotificationManager.notify(mId, n.build());
}
else
{
mNotificationManager.cancel(mId);
}
}
}
并且在BootReceiver中的onReceive()
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, intent.getAction().toString());
MyNotificationManager myNotificationMan = new MyNotificationManager(context);
myNotificationMan.handleNotification();
}
我在我的应用程序中显示自定义通知,它工作正常,但我想在设备启动后启动此通知,但此时它生成错误
错误Logcat:
01-17 20:29:40.281 1652 1785 W PackageManager: Failure retrieving resources for com.ltlgen.guest_mode: Resource ID #0x0
01-17 20:30:42.721 1070 1629 D ActivityManager: startProcessLocked calleePkgName: com.ltlgen.guest_mode, hostingType: broadcast-2
01-17 20:30:42.781 1070 1629 I ActivityManager: Start proc 6558:com.ltlgen.guest_mode/u0a188 for broadcast-2 com.ltlgen.guest_mode/.BootReceiver
01-17 20:30:42.971 6558 6558 W ResourcesManager: getTopLevelResources: com.ltlgen.guest_mode for user 0
01-17 20:30:42.991 6558 6558 D InjectionManager: fillFeatureStoreMap com.ltlgen.guest_mode
01-17 20:30:43.001 6558 6558 I InjectionManager: Constructor com.ltlgen.guest_mode, Feature store :{}
01-17 20:30:43.001 6558 6558 D guest_mode.BootReceiver: android.intent.action.BOOT_COMPLETED
01-17 20:30:43.091 6558 6558 E AndroidRuntime: Process: com.ltlgen.guest_mode, PID: 6558
01-17 20:30:43.091 6558 6558 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.ltlgen.guest_mode.BootReceiver: java.lang.IllegalArgumentException: No such package
01-17 20:30:43.091 6558 6558 E AndroidRuntime: at com.ltlgen.guest_mode.MainActivity.handleNotification(MainActivity.java:149)
01-17 20:30:43.091 6558 6558 E AndroidRuntime: at com.ltlgen.guest_mode.BootReceiver.onReceive(BootReceiver.java:16)
01-17 20:30:43.291 1070 1102 D StatusBarManagerService: manageDisableList userId=0 what=0x0 pkg=Window{4ea5511 u0 Application Error: com.ltlgen.guest_mode}
01-17 20:30:45.331 1070 1692 I ActivityManager: Process com.ltlgen.guest_mode (pid 6558)(adj 15) has died(34,451)
错误:第 149 行没有这样的包
这是第 149 行
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification);
完整方法代码如下
public void handleNotification()
{
int mId = 22120927;
boolean active = isNotificationActive();
PendingIntent pi = PendingIntent.getService(mContext, 0, new Intent(mContext, MainService.class), PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder n = new NotificationCompat.Builder(mContext);
n.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher);
if (DEBUG_MODE)
{
n.setPriority(NotificationCompat.PRIORITY_MIN);
}
RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification);
view.setOnClickPendingIntent(R.id.notificationImageButton1, pi);
n.setContent(view);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (active)
{
mNotificationManager.notify(mId, n.build());
}
else
{
mNotificationManager.cancel(mId);
}
}
BootReceiver.xml
MainActivity main = new MainActivity();
main.handleNotification();
main.finish();
AndroidManifest.xnl
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:resizeableActivity = "true">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DialerActivity"
android:label=""
android:windowSoftInputMode="stateVisible" />
<service android:name=".MainService" />
<receiver
android:name=".BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
在@Mike M 的评论帮助下我的问题已经解决了
GetPackageManager() 需要在创建 MainActivity 时未初始化的上下文 class 从 BootReceiver 手动实例化
现在,我在 MyNotificationManager class 中单独处理通知,如下所示:
public class MyNotificationManager
{
private Context mContext;
SharedPreferences mShPrefs;
SharedPreferences.Editor mShPrefsEditor;
private static final String KEY_NOTIFICATION_STATUS = "notification_status";
public MyNotificationManager(Context context)
{
mContext = context;
mShPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mShPrefsEditor = mShPrefs.edit();
}
public void handleNotification()
{
int mId = 22120927;
boolean active = isNotificationActive();
PendingIntent pi = PendingIntent.getService(mContext, 0, new Intent(mContext, MainService.class), PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder n = new NotificationCompat.Builder(mContext);
n.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher);
if (MainActivity.DEBUG_MODE)
{
n.setPriority(NotificationCompat.PRIORITY_MIN);
}
RemoteViews view = new RemoteViews(mContext.getPackageName(), R.layout.notification);
view.setOnClickPendingIntent(R.id.notificationImageButton1, pi);
n.setContent(view);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (active)
{
mNotificationManager.notify(mId, n.build());
}
else
{
mNotificationManager.cancel(mId);
}
}
}
并且在BootReceiver中的onReceive()
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, intent.getAction().toString());
MyNotificationManager myNotificationMan = new MyNotificationManager(context);
myNotificationMan.handleNotification();
}