Android通知欄前臺服務的實現(xiàn)
一、前臺服務的簡單介紹
前臺服務是那些被認為用戶知道且在系統(tǒng)內存不足的時候不允許系統(tǒng)殺死的服務。前臺服務必須給狀態(tài)欄提供一個通知,它被放到正在運行(Ongoing)標題之下——這就意味著通知只有在這個服務被終止或從前臺主動移除通知后才能被解除。
最常見的表現(xiàn)形式就是音樂播放服務,應用程序后臺運行時,用戶可以通過通知欄,知道當前播放內容,并進行暫停、繼續(xù)、切歌等相關操作。
二、為什么使用前臺服務
后臺運行的Service系統(tǒng)優(yōu)先級相對較低,當系統(tǒng)內存不足時,在后臺運行的Service就有可能被回收,為了保持后臺服務的正常運行及相關操作,可以選擇將需要保持運行的Service設置為前臺服務,從而使APP長時間處于后臺或者關閉(進程未被清理)時,服務能夠保持工作。
三、前臺服務的詳細使用
創(chuàng)建服務內容,如下(四大組件不要忘記清單文件進行注冊,否則啟動會找不到服務);
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)建服務通知內容,例如音樂播放,藍牙設備正在連接等:
/**
* 創(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");
//通知內容
builder.setContentText("ContentText");
//設定通知顯示的時間
builder.setWhen(System.currentTimeMillis());
//設定啟動的內容
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)建通知:
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate");
// 獲取服務通知
Notification notification = createForegroundNotification();
//將服務置于啟動狀態(tài) ,NOTIFICATION_ID指的是創(chuàng)建的通知的ID
startForeground(NOTIFICATION_ID, notification);
}
停止服務時,移除通知:
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy");
// 標記服務關閉
ForegroundService.serviceIsLive = false;
// 移除通知
stopForeground(true);
super.onDestroy();
}
判斷服務是否啟動及獲取傳遞信息:
@Override
public 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 通知欄前臺內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android使用Messenger實現(xiàn)service與activity交互
這篇文章主要介紹了android使用Messenger實現(xiàn)service與activity交互的相關資料,需要的朋友可以參考下2016-06-06
android實現(xiàn)簡單進度條ProgressBar效果
這篇文章主要為大家詳細介紹了android實現(xiàn)簡單進度條ProgressBar效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
Android實現(xiàn)讀寫JSON數(shù)據(jù)的方法
這篇文章主要介紹了Android實現(xiàn)讀寫JSON數(shù)據(jù)的方法,以完整實例形式分析了Android解析及生成json數(shù)據(jù)的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
android之json數(shù)據(jù)過長打印不全問題的解決
這篇文章主要介紹了android之json數(shù)據(jù)過長打印不全問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04

