欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年10月14日 09:19:21   作者:屌絲迷途  
這篇文章主要介紹了Android 兩個Service的相互監(jiān)視實現(xiàn)代碼的相關(guā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è)(例如下載文件)的服務。

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

相關(guān)文章

  • Kotlin匿名函數(shù)使用介紹

    Kotlin匿名函數(shù)使用介紹

    定義時不取名字的函數(shù),我們稱之為匿名函數(shù),匿名函數(shù)通常整體傳遞給其他函數(shù)或者從其他函數(shù)返回,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Android自定義加載圈的方法

    Android自定義加載圈的方法

    這篇文章主要為大家詳細介紹了Android自定義加載圈的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Android編程獲取控件寬和高的方法總結(jié)分析

    Android編程獲取控件寬和高的方法總結(jié)分析

    這篇文章主要介紹了Android編程獲取控件寬和高的方法,結(jié)合實例形式對比總結(jié)并分析了Android控件屬性的相關(guān)操作技巧,需要的朋友可以參考下
    2016-01-01
  • 簡述Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法

    簡述Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法

    本篇文章主要對Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進行介紹,相信對大家學習會有很好的幫助,需要的朋友一起來看下吧
    2016-12-12
  • Android實現(xiàn)帶有刪除按鈕的EditText示例代碼

    Android實現(xiàn)帶有刪除按鈕的EditText示例代碼

    本文給大家介紹一個很實用的小控件,就是在Android系統(tǒng)的輸入框右邊加入一個小圖標,點擊小圖標可以清除輸入框里面的內(nèi)容,IOS上面直接設(shè)置某個屬性就可以實現(xiàn)這一功能,但是Android原生EditText不具備此功能,所以要想實現(xiàn)這一功能我們需要重寫EditText。下面來看看吧。
    2016-12-12
  • Android gradle插件打印時間戳的方法詳解

    Android gradle插件打印時間戳的方法詳解

    這篇文章主要給大家介紹了關(guān)于Android gradle插件打印時間戳的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Flutter實現(xiàn)自定義下拉選擇框的示例詳解

    Flutter實現(xiàn)自定義下拉選擇框的示例詳解

    在一些列表頁面中,我們經(jīng)常會有上方篩選項的的需求,點擊出現(xiàn)一個下拉菜單,而在Flutter中,并沒有現(xiàn)成的這樣的組件,所以最好我們可以自己做一個。本文將利用Flutter實現(xiàn)自定義下拉選擇框,需要的可以參考一下
    2022-04-04
  • Android仿微博加載長圖滾動查看效果

    Android仿微博加載長圖滾動查看效果

    這篇文章主要為大家詳細介紹了Android仿微博加載長圖滾動查看效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android處理視圖圓角和色彩的工具類

    Android處理視圖圓角和色彩的工具類

    這篇文章主要為大家詳細介紹了Android處理視圖圓角和色彩的工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android使用Opengl錄像時添加水印

    Android使用Opengl錄像時添加水印

    這篇文章主要為大家詳細介紹了Android使用Opengl錄像時添加水印,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論