我正在处理自定义通知,我使用RemoteViews来自定义通知布局。一切正常,除了我遇到的问题,当Service类崩溃并再次自己调用时,我为RemoteView创建的全局值变为null。所以最终它会抛出NullPointerException
。
服务类崩溃情景:
从通知到PendingIntent
启动活动时,当用户从最近的任务中滑动活动时,我的应用程序正在崩溃。为此我已经应用了以下某种逻辑:
(i)将服务类中的onStartCommand
方法的返回类型从START_STICKY
更改为START_STICKY_COMPATIBILITY
(使用此方法,因为之前的服务调用之前的意图重新启动)
(ii)检查null
意图条件如下:
//If the intent is null, do not execute the switch statement. If it is not null perform the action.
if (intent==null)
return 0;
我的要求:
我有一个播放和暂停的音乐播放器,我需要根据为视图指定的PendintIntent
处理播放/暂停情况。
点击视图时使用PendingIntent的代码:
Intent intent = new Intent(context, ServiceExample.class);
intent.setAction(CLICK_PLAY_PAUSE);
PendingIntent musicPlayPauseClickIntent = PendingIntent.getService(context, 0,intent, 0);
mRemoteViewsMusics.setOnClickPendingIntent(R.id.img_play_pause, musicPlayPauseClickIntent);
用于在点击通知中的缩略图时打开活动的代码:
Intent openAcivityIntent = new Intent(context, toClass);
openAcivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent.getActivity(context,0,openAcivityIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
代码用于处理服务类中的点击事件。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
case CLICK_PLAY_PAUSE:
//NOTE: Getting `NullPointerException` on mRemoteViewsMusics
mRemoteViewsMusics.setImageViewResource(R.id.img_play_pause,
R.drawable.ic_noti_pause_circle);
mMediaPlayer.start();
break;
return START_STICKY_COMPATIBILITY;
case TYPE_MUSIC:
showMusicNotification();
break;
}
创建RemoteViews的代码:
public void showMusicNotification(){
private RemoteViews mRemoteViewsMusics;
mRemoteViewsMusics = new RemoteViews(getPackageName(),
R.layout.music_notification);
}
注意:每当调用onStartCommand()
时,根据通知类型我会更新通知类型。该类型基于Intent
标志,该标志在启动Service
时分配。
我已经被这个问题困扰了一个多星期。请帮我纠正这个问题。任何形式的建议或建议对我都有帮助。提前谢谢。