国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 兩個Service的相互監(jiān)視實現代碼

2019-12-12 05:04:14
字體:
來源:轉載
供稿:網友

兩個Service之間相互監(jiān)視的實現

在實際開發(fā)中可能需要用到兩個Service相互監(jiā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();
而不能直接類型轉換

((ServiceA.MyBinder)iBinder).getName(); 

onStartCommand

onStartCommand() 方法必須返回整型數。整型數是一個值,用于描述系統應該如何在服務終止的情況下繼續(xù)運行服務。

返回的值必須是以下常量之一:

START_NOT_STICKY

  如果系統在 onStartCommand() 返回后終止服務,則除非有掛起 Intent 要傳遞,否則系統不會重建服務。

START_STICKY

  如果系統在 onStartCommand() 返回后終止服務,則會重建服務并調用 onStartCommand(),但絕對不會重新傳遞最后一個 Intent。相反,除非有掛起 Intent 要啟動服務(在這種情況下,將傳遞這些 Intent ),否則系統會通過空 Intent 調用 onStartCommand()。這適用于不執(zhí)行命令、但無限期運行并等待作業(yè)的媒體播放器(或類似服務)。

START_REDELIVER_INTENT

  如果系統在 onStartCommand() 返回后終止服務,則會重建服務,并通過傳遞給服務的最后一個 Intent 調用 onStartCommand()。任何掛起 Intent 均依次傳遞。這適用于主動執(zhí)行應該立即恢復的作業(yè)(例如下載文件)的服務。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉义市| 鹤山市| 德钦县| 永昌县| 武隆县| 灵川县| 罗甸县| 福清市| 达尔| 庐江县| 桐梓县| 峨山| 旬邑县| 迭部县| 永康市| 凤阳县| 普兰店市| 哈密市| 富川| 自贡市| 包头市| 西畴县| 新野县| 广德县| 新化县| 西宁市| 龙胜| 通道| 原平市| 本溪| 枣强县| 绥中县| 沁水县| 朝阳区| 西盟| 洞头县| 鹤庆县| 玛多县| 新建县| 赤峰市| 邮箱|