Android通知欄前臺服務的實現(xiàn)
一、前臺服務的簡單介紹
前臺服務是那些被認為用戶知道且在系統(tǒng)內(nèi)存不足的時候不允許系統(tǒng)殺死的服務。前臺服務必須給狀態(tài)欄提供一個通知,它被放到正在運行(Ongoing)標題之下——這就意味著通知只有在這個服務被終止或從前臺主動移除通知后才能被解除。
最常見的表現(xiàn)形式就是音樂播放服務,應用程序后臺運行時,用戶可以通過通知欄,知道當前播放內(nèi)容,并進行暫停、繼續(xù)、切歌等相關操作。
二、為什么使用前臺服務
后臺運行的Service系統(tǒng)優(yōu)先級相對較低,當系統(tǒng)內(nèi)存不足時,在后臺運行的Service就有可能被回收,為了保持后臺服務的正常運行及相關操作,可以選擇將需要保持運行的Service設置為前臺服務,從而使APP長時間處于后臺或者關閉(進程未被清理)時,服務能夠保持工作。
三、前臺服務的詳細使用
創(chuàng)建服務內(nèi)容,如下(四大組件不要忘記清單文件進行注冊,否則啟動會找不到服務);
public class ForegroundService extends Service { private static final String TAG = ForegroundService.class.getSimpleName(); @Override public void onCreate() { super.onCreate(); Log.e(TAG, 'onCreate'); } @Nullable @Override public IBinder onBind(Intent intent) { Log.e(TAG, 'onBind'); return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, 'onStartCommand'); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.e(TAG, 'onDestroy'); super.onDestroy(); } }
創(chuàng)建服務通知內(nèi)容,例如音樂播放,藍牙設備正在連接等:
/** * 創(chuàng)建服務通知 */private Notification createForegroundNotification() { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 唯一的通知通道的id. String notificationChannelId = 'notification_channel_id_01'; // Android8.0以上的系統(tǒng),新建消息通道 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //用戶可見的通道名稱 String channelName = 'Foreground Service Notification'; //通道的重要程度 int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId, channelName, importance); notificationChannel.setDescription('Channel description'); //LED燈 notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.RED); //震動 notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000}); notificationChannel.enableVibration(true); if (notificationManager != null) { notificationManager.createNotificationChannel(notificationChannel); } } NotificationCompat.Builder builder = new NotificationCompat.Builder(this, notificationChannelId); //通知小圖標 builder.setSmallIcon(R.drawable.ic_launcher); //通知標題 builder.setContentTitle('ContentTitle'); //通知內(nèi)容 builder.setContentText('ContentText'); //設定通知顯示的時間 builder.setWhen(System.currentTimeMillis()); //設定啟動的內(nèi)容 Intent activityIntent = new Intent(this, NotificationActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); //創(chuàng)建通知并返回 return builder.build();}
啟動服務時,創(chuàng)建通知:
@Overridepublic void onCreate() { super.onCreate(); Log.e(TAG, 'onCreate'); // 獲取服務通知 Notification notification = createForegroundNotification(); //將服務置于啟動狀態(tài) ,NOTIFICATION_ID指的是創(chuàng)建的通知的ID startForeground(NOTIFICATION_ID, notification);}
停止服務時,移除通知:
@Overridepublic void onDestroy() { Log.e(TAG, 'onDestroy'); // 標記服務關閉 ForegroundService.serviceIsLive = false; // 移除通知 stopForeground(true); super.onDestroy();}
判斷服務是否啟動及獲取傳遞信息:
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { Log.e(TAG, 'onStartCommand'); // 標記服務啟動 ForegroundService.serviceIsLive = true; // 數(shù)據(jù)獲取 String data = intent.getStringExtra('Foreground'); Toast.makeText(this, data, Toast.LENGTH_SHORT).show(); return super.onStartCommand(intent, flags, startId);}
以上就是前臺服務的創(chuàng)建過程,相關注釋已經(jīng)很明白了,具體使用可以查看文末的Demo。
服務創(chuàng)建完畢,接下來就可以進行服務的啟動了,啟動前不要忘記在清單文件中進行前臺服務權限的添加:
<uses-permission android:name='android.permission.FOREGROUND_SERVICE' />
服務的啟動和停止
//啟動服務if (!ForegroundService.serviceIsLive) { // Android 8.0使用startForegroundService在前臺啟動新服務 mForegroundService = new Intent(this, ForegroundService.class); mForegroundService.putExtra('Foreground', 'This is a foreground service.'); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(mForegroundService); } else { startService(mForegroundService); }} else { Toast.makeText(this, '前臺服務正在運行中...', Toast.LENGTH_SHORT).show();}
//停止服務mForegroundService = new Intent(this, ForegroundService.class);stopService(mForegroundService);
關于前臺服務的介紹及使用就到這里了,相關使用已上傳至Github開發(fā)記錄,歡迎點擊查閱及Star,我也會繼續(xù)補充其它有用的知識及例子在項目上。
到此這篇關于Android通知欄前臺服務的實現(xiàn)的文章就介紹到這了,更多相關Android 通知欄前臺內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!
相關文章:
1. Python 實現(xiàn)勞拉游戲的實例代碼(四連環(huán)、重力四子棋)2. .Net加密神器Eazfuscator.NET?2023.2?最新版使用教程3. Java GZip 基于內(nèi)存實現(xiàn)壓縮和解壓的方法4. java獲取文件編碼,jsoup獲取html純文本操作5. 利用CSS制作3D動畫6. 一款功能強大的markdown編輯器tui.editor使用示例詳解7. 淺談Android Studio導出javadoc文檔操作及問題的解決8. 存儲于xml中需要的HTML轉(zhuǎn)義代碼9. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)10. python 寫函數(shù)在一定條件下需要調(diào)用自身時的寫法說明
