這兩天開始做一個音樂播放器,慢慢完善功能,打算把遇到的一些問題記下來苛蒲,故對代碼沒有什么解釋。寄月。希望讀者能有所收獲。
為了能讓讀者看的不那么難受忱辅,我把代碼拆開來講(完整的代碼就是拆分的拼起來),包括筆者遇到的兩個報異常的地方损搬,解決后終于成功開啟弄匕。
效果圖在最后(簡陋版看看就好)
如果哪里有誤歡迎指正剩瓶,不,請務必指正。
先初始化我們定義的Layout
這個Layout就是下拉菜單欄顯示的樣式。
views = new RemoteViews(getPackageName(), R.layout.notification_music);
views.setTextViewText(R.id.tv_playmusic, musics.get(curMusic).getMusic());
views.setTextViewText(R.id.tv_playsinger, musics.get(curMusic).getSinger());
RemoteViews能夠支持更改Layout中控件用到的資源(如更換背景),使用
setInt(int viewId, String methodName, int value)
菠劝,
其中methodName是調(diào)用的方法名(實際是以方法名通過反射),value是資源文件的id寓调。
定義Layout中控件的點擊效果
//next music
Intent intentSkipNext = new Intent(MusicChangedReceiver.Action_Notification_SkipNext);
PendingIntent skipNextPendingIntent = PendingIntent.getBroadcast(this, NEXT_PENDINGINTENT_REQUESTCODE,
intentSkipNext, PendingIntent.FLAG_CANCEL_CURRENT);
views.setOnClickPendingIntent(R.id.btn_skip_next, skipNextPendingIntent);
這部分只貼一個痛悯,實際是通過發(fā)送廣播實現(xiàn)的,需要綁定一個BroadcastReceiver來接受廣播,在通過switch分Action進行對應處理斋枢。
定義點擊Notification的動作(就是Layout除去定義了點擊事件的控件的位置)
我這里的動作是啟動MainActivity(設置了singleTask的啟動模式)
注意這里沒有把PendingIntent放入RemoteViews中涩赢,而是要直接設置在Notification中(下一部分)
Intent intentContent = new Intent(this, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity(this, CONTENT_PENDINGINTENT_REQUESTCODE,
intentContent, PendingIntent.FLAG_CANCEL_CURRENT);
定義Notification移除時的動作
我沒有定義花墩,暫時沒這個需求。
創(chuàng)建Notification.Builder
從這里就可以看出來Notification使用了Builder模式
其中 setSmallIcon, setContentTitle, setContentText 是必須要有的,不然會出現(xiàn)異常前臺開啟失敗东羹,反正最后不會顯示出來(因為設置了自定義的布局)
builder = new Notification.Builder(this)
// 設置小圖標
.setSmallIcon(R.drawable.ic_stop_red_40dp)
// 設置標題
.setContentTitle("nemuniPlayer")
// 設置內(nèi)容
.setContentText("content")
.setAutoCancel(false)
//這里設置點擊Notification的動作
//這里設置點擊Notification的動作
//這里設置點擊Notification的動作
.setContentIntent(contentPendingIntent)
.setContent(views);
獲取NotificationManager
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
!重點!設置NotificationChannel,8.0以上不設會報異常啟動失敗
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String CHANNEL_ID = "com.example.nemuni.channel";
String CHANNEL_NAME = "Music Channel";
NotificationChannel notificationChannel= new NotificationChannel(CHANNEL_ID, CHANNEL_NAME,
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
notificationManager.createNotificationChannel(notificationChannel);
builder.setChannelId(CHANNEL_ID);
}
(我是不會說ID和NAME的命名都是我隨意的按灶,確保ID唯一應該就沒問題了吧)
剩下的就是啟動了
startForeground(NOTIFICATION_PENDINGINTENT_ID, builder.build());
這里的ID我使用了進程的ID(反正我也就啟動這一個前臺服務)
private static final int NOTIFICATION_PENDINGINTENT_ID = android.os.Process.myPid();
順便貼onDestroy()里的取消操作吧
if (notificationManager != null) {
notificationManager.cancel(NOTIFICATION_PENDINGINTENT_ID);
stopForeground(true);
}