Android 兩個Service的相互監(jiān)視實現(xiàn)代碼
兩個Service之間相互監(jiān)視的實現(xiàn)
在實際開發(fā)中可能需要用到兩個Service相互監(jiān)視的情況,本示例就是實現(xiàn)此功能以作參考。
服務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("守護服務A啟動中")
.setContentText("我是來守護服務B的")
.setContentTitle("守護服務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);
}
}
}
服務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("守護服務B啟動中")
.setContentText("我是來守護服務A的")
.setContentTitle("守護服務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" />
由于涉及到跨進程,onServiceConnected() 方法中使用
IBridgeInterface.Stub.asInterface(iBinder).getName();
而不能直接類型轉(zhuǎn)換
((ServiceA.MyBinder)iBinder).getName();
onStartCommand
onStartCommand() 方法必須返回整型數(shù)。整型數(shù)是一個值,用于描述系統(tǒng)應該如何在服務終止的情況下繼續(xù)運行服務。
返回的值必須是以下常量之一:
START_NOT_STICKY
如果系統(tǒng)在 onStartCommand() 返回后終止服務,則除非有掛起 Intent 要傳遞,否則系統(tǒng)不會重建服務。
START_STICKY
如果系統(tǒng)在 onStartCommand() 返回后終止服務,則會重建服務并調(diào)用 onStartCommand(),但絕對不會重新傳遞最后一個 Intent。相反,除非有掛起 Intent 要啟動服務(在這種情況下,將傳遞這些 Intent ),否則系統(tǒng)會通過空 Intent 調(diào)用 onStartCommand()。這適用于不執(zhí)行命令、但無限期運行并等待作業(yè)的媒體播放器(或類似服務)。
START_REDELIVER_INTENT
如果系統(tǒng)在 onStartCommand() 返回后終止服務,則會重建服務,并通過傳遞給服務的最后一個 Intent 調(diào)用 onStartCommand()。任何掛起 Intent 均依次傳遞。這適用于主動執(zhí)行應該立即恢復的作業(yè)(例如下載文件)的服務。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android中Service與Activity之間通信的幾種方式
- Android實現(xiàn)微信自動向附近的人打招呼(AccessibilityService)
- Android AccessibilityService實現(xiàn)微信搶紅包插件
- Android Service服務不被停止詳解及實現(xiàn)
- Android Service中使用Toast無法正常顯示問題的解決方法
- Android基于service實現(xiàn)音樂的后臺播放功能示例
- Android Activity 與Service進行數(shù)據(jù)交互詳解
- 淺談Android Activity與Service的交互方式
- Android Service中方法使用詳細介紹
- Android 如何保證service在后臺不被kill
相關(guān)文章
簡述Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法
本篇文章主要對Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進行介紹,相信對大家學習會有很好的幫助,需要的朋友一起來看下吧2016-12-12
Android實現(xiàn)帶有刪除按鈕的EditText示例代碼
本文給大家介紹一個很實用的小控件,就是在Android系統(tǒng)的輸入框右邊加入一個小圖標,點擊小圖標可以清除輸入框里面的內(nèi)容,IOS上面直接設(shè)置某個屬性就可以實現(xiàn)這一功能,但是Android原生EditText不具備此功能,所以要想實現(xiàn)這一功能我們需要重寫EditText。下面來看看吧。2016-12-12

