Android 兩個(gè)Service的相互監(jiān)視實(shí)現(xiàn)代碼
兩個(gè)Service之間相互監(jiān)視的實(shí)現(xiàn)
在實(shí)際開發(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("我是來守護(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+"斷開連接",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("我是來守護(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 + "斷開連接", 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();
而不能直接類型轉(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ì)通過空 Intent 調(diào)用 onStartCommand()。這適用于不執(zhí)行命令、但無(wú)限期運(yùn)行并等待作業(yè)的媒體播放器(或類似服務(wù))。
START_REDELIVER_INTENT
如果系統(tǒng)在 onStartCommand() 返回后終止服務(wù),則會(huì)重建服務(wù),并通過傳遞給服務(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ú)法正常顯示問題的解決方法
- Android基于service實(shí)現(xiàn)音樂的后臺(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ì)有很好的幫助,需要的朋友一起來看下吧2016-12-12
Android實(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)這一功能我們需要重寫EditText。下面來看看吧。2016-12-12
Android gradle插件打印時(shí)間戳的方法詳解
這篇文章主要給大家介紹了關(guān)于Android gradle插件打印時(shí)間戳的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
Flutter實(shí)現(xiàn)自定義下拉選擇框的示例詳解
在一些列表頁(yè)面中,我們經(jīng)常會(huì)有上方篩選項(xiàng)的的需求,點(diǎn)擊出現(xiàn)一個(gè)下拉菜單,而在Flutter中,并沒有現(xiàn)成的這樣的組件,所以最好我們可以自己做一個(gè)。本文將利用Flutter實(shí)現(xiàn)自定義下拉選擇框,需要的可以參考一下2022-04-04
Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果
這篇文章主要為大家詳細(xì)介紹了Android仿微博加載長(zhǎng)圖滾動(dòng)查看效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12

