Android 兩個(gè)Service的相互監(jiān)視實(shí)現(xiàn)代碼
兩個(gè)Service之間相互監(jiān)視的實(shí)現(xiàn)
在實(shí)際開(kāi)發(fā)中可能需要用到兩個(gè)Service相互監(jiān)視的情況,本示例就是實(shí)現(xiàn)此功能以作參考。
服務(wù)A:
public class ServiceA extends Service { private static final String TAG = ServiceA.class.getSimpleName(); MyBinder mBinder; MyServiceConnection mServiceConnection; PendingIntent mPendingIntent; @Override public void onCreate() { super.onCreate(); if(mBinder==null) { mBinder=new MyBinder(); } mServiceConnection=new MyServiceConnection(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT); mPendingIntent=PendingIntent.getService(this,0,intent,0); Notification.Builder builder=new Notification.Builder(this); builder.setTicker("守護(hù)服務(wù)A啟動(dòng)中") .setContentText("我是來(lái)守護(hù)服務(wù)B的") .setContentTitle("守護(hù)服務(wù)A") .setSmallIcon(R.mipmap.ic_launcher) .setContentIntent(mPendingIntent) .setWhen(System.currentTimeMillis()); Notification notification=builder.build(); startForeground(startId,notification); return START_STICKY; } @Override public IBinder onBind(Intent intent) { return mBinder; } public class MyBinder extends IBridgeInterface.Stub { @Override public String getName() throws RemoteException { return "name:"+TAG; } } class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { String name=null; try { name= IBridgeInterface.Stub.asInterface(iBinder).getName(); } catch (RemoteException e) { e.printStackTrace(); } Toast.makeText(ServiceA.this,name+"連接成功",Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName componentName) { Toast.makeText(ServiceA.this,TAG+"斷開(kāi)連接",Toast.LENGTH_SHORT).show(); ServiceA.this.startService(new Intent(ServiceA.this,ServiceB.class)); ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT); } } }
服務(wù)B:
public class ServiceB extends Service { private static final String TAG = ServiceB.class.getSimpleName(); private PendingIntent mPendingIntent; private MyBinder mBinder; private MyServiceConnection mServiceConnection; @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onCreate() { super.onCreate(); if (mBinder == null) { mBinder = new MyBinder(); } mServiceConnection = new MyServiceConnection(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT); mPendingIntent = PendingIntent.getService(this, 0, intent, 0); Notification.Builder builder = new Notification.Builder(this); builder.setTicker("守護(hù)服務(wù)B啟動(dòng)中") .setContentText("我是來(lái)守護(hù)服務(wù)A的") .setContentTitle("守護(hù)服務(wù)B") .setSmallIcon(R.mipmap.ic_launcher) .setContentIntent(mPendingIntent) .setWhen(System.currentTimeMillis()); Notification notification = builder.build(); startForeground(startId, notification); return START_STICKY; } public class MyBinder extends IBridgeInterface.Stub { @Override public String getName() throws RemoteException { return "name:"+TAG; } } class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { String name=null; try { name=IBridgeInterface.Stub.asInterface(iBinder).getName(); } catch (RemoteException e) { e.printStackTrace(); } Toast.makeText(ServiceB.this, name + "連接成功", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName componentName) { Toast.makeText(ServiceB.this, TAG + "斷開(kāi)連接", Toast.LENGTH_SHORT).show(); ServiceB.this.startService(new Intent(ServiceB.this, ServiceA.class)); ServiceB.this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT); } } }
IBridgeInterface.aidl
1 interface IBridgeInterface { 2 String getName(); 3 }
界面:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(new Intent(this, ServiceA.class)); startService(new Intent(this, ServiceB.class)); } }
AndroidManifest.xml
<service android:name=".services.ServiceA" /> <service android:name=".services.ServiceB" android:process=":remote" />
由于涉及到跨進(jìn)程,onServiceConnected() 方法中使用
IBridgeInterface.Stub.asInterface(iBinder).getName();
而不能直接類(lèi)型轉(zhuǎn)換
((ServiceA.MyBinder)iBinder).getName();
onStartCommand
onStartCommand() 方法必須返回整型數(shù)。整型數(shù)是一個(gè)值,用于描述系統(tǒng)應(yīng)該如何在服務(wù)終止的情況下繼續(xù)運(yùn)行服務(wù)。
返回的值必須是以下常量之一:
START_NOT_STICKY
如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則除非有掛起 Intent 要傳遞,否則系統(tǒng)不會(huì)重建服務(wù)。
START_STICKY
如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則會(huì)重建服務(wù)并調(diào)用 onStartCommand(),但絕對(duì)不會(huì)重新傳遞最后一個(gè) Intent。相反,除非有掛起 Intent 要啟動(dòng)服務(wù)(在這種情況下,將傳遞這些 Intent ),否則系統(tǒng)會(huì)通過(guò)空 Intent 調(diào)用 onStartCommand()。這適用于不執(zhí)行命令、但無(wú)限期運(yùn)行并等待作業(yè)的媒體播放器(或類(lèi)似服務(wù))。
START_REDELIVER_INTENT
如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則會(huì)重建服務(wù),并通過(guò)傳遞給服務(wù)的最后一個(gè) Intent 調(diào)用 onStartCommand()。任何掛起 Intent 均依次傳遞。這適用于主動(dòng)執(zhí)行應(yīng)該立即恢復(fù)的作業(yè)(例如下載文件)的服務(wù)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Android中Service與Activity之間通信的幾種方式
- Android實(shí)現(xiàn)微信自動(dòng)向附近的人打招呼(AccessibilityService)
- Android AccessibilityService實(shí)現(xiàn)微信搶紅包插件
- Android Service服務(wù)不被停止詳解及實(shí)現(xiàn)
- Android Service中使用Toast無(wú)法正常顯示問(wèn)題的解決方法
- Android基于service實(shí)現(xiàn)音樂(lè)的后臺(tái)播放功能示例
- Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解
- 淺談Android Activity與Service的交互方式
- Android Service中方法使用詳細(xì)介紹
- Android 如何保證service在后臺(tái)不被kill
相關(guān)文章
簡(jiǎn)述Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法
本篇文章主要對(duì)Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進(jìn)行介紹,相信對(duì)大家學(xué)習(xí)會(huì)有很好的幫助,需要的朋友一起來(lái)看下吧2016-12-12Android實(shí)現(xiàn)帶有刪除按鈕的EditText示例代碼
本文給大家介紹一個(gè)很實(shí)用的小控件,就是在Android系統(tǒng)的輸入框右邊加入一個(gè)小圖標(biāo),點(diǎn)擊小圖標(biāo)可以清除輸入框里面的內(nèi)容,IOS上面直接設(shè)置某個(gè)屬性就可以實(shí)現(xiàn)這一功能,但是Android原生EditText不具備此功能,所以要想實(shí)現(xiàn)這一功能我們需要重寫(xiě)EditText。下面來(lái)看看吧。2016-12-12Android gradle插件打印時(shí)間戳的方法詳解
這篇文章主要給大家介紹了關(guān)于Android gradle插件打印時(shí)間戳的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Flutter實(shí)現(xiàn)自定義下拉選擇框的示例詳解
在一些列表頁(yè)面中,我們經(jīng)常會(huì)有上方篩選項(xiàng)的的需求,點(diǎn)擊出現(xiàn)一個(gè)下拉菜單,而在Flutter中,并沒(méi)有現(xiàn)成的這樣的組件,所以最好我們可以自己做一個(gè)。本文將利用Flutter實(shí)現(xiàn)自定義下拉選擇框,需要的可以參考一下2022-04-04Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果
這篇文章主要為大家詳細(xì)介紹了Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12