亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android使用AIDL實現(xiàn)兩個App間通信

 更新時間:2018年04月17日 11:33:32   作者:斡風的天空  
這篇文章主要為大家詳細介紹了Android使用AIDL實現(xiàn)兩個App間通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下

今天開發(fā)了一個功能,通過Android的AIDL機制完成兩個app間的通信。功能需求很簡單,一個客戶端app,叫做client,一個服務(wù)端app叫orderManager;客戶端負責展示訂單列表,并且可以向服務(wù)端添加訂單;服務(wù)端負責管理訂單,可以對外提供訂單信息。

閑言少敘,下面直接上代碼。

1、編寫bean類。

首先在client中定義OrderBean類,字段很簡單,注意需要實現(xiàn)Parcelable接口:

package com.example.wang.client.bean;

import android.os.Parcel;
import android.os.Parcelable;

public class OrderBean implements Parcelable{
 private String id;
 private String name;
 private int amount;

 public OrderBean(){}

 public OrderBean(String id, String name, int amount) {
 this.id = id;
 this.name = name;
 this.amount = amount;
 }

 protected OrderBean(Parcel in) {
 id = in.readString();
 name = in.readString();
 amount = in.readInt();
 }

 public static final Creator<OrderBean> CREATOR = new Creator<OrderBean>() {
 @Override
 public OrderBean createFromParcel(Parcel in) {
  return new OrderBean(in);
 }

 @Override
 public OrderBean[] newArray(int size) {
  return new OrderBean[size];
 }
 };
 @Override
 public int describeContents() {
 return 0;
 }

 @Override
 public void writeToParcel(Parcel dest, int flags) {
 dest.writeString(id);
 dest.writeString(name);
 dest.writeInt(amount);
 }
 //get/set方法略
}

2、定義aidl文件。aidl文件的存放位置在Android Studio中一般存放在如下路徑:
client/src/aidl/…

 // OrderBean.aidl
package com.example.wang.client.bean;//存放的包路徑同bean類
parcelable OrderBean;//通信用到的Parcelable需要聲明,并且使用小寫的parcelable

// IBookManager.aidl
package com.example.wang.client.aidl;

import com.example.wang.client.bean.OrderBean;//除了系統(tǒng)提供的對象,都需要明確導(dǎo)入

interface IOrderManager {
 List<OrderBean> getAll();
 void add(in OrderBean bean);
}

3、定義布局文件,編寫MainActivity。這個很簡單,Button和RecyclerView結(jié)合即可:

#activity_main.xml - 主頁面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:layout_marginTop="5dp"
 android:text="訂單管理"
 android:textSize="20dp"/>
 <LinearLayout
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:padding="5dp">
 <Button
  android:id="@+id/search_button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textSize="15dp"
  android:text="刷新訂單"/>
 <Button
  android:id="@+id/add_button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textSize="15dp"
  android:text="添加訂單"/>
 </LinearLayout>
 <android.support.v7.widget.RecyclerView
 android:id="@+id/recyclerView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 />
</LinearLayout>

還要寫一個item_order.xml,用于RecyclerView的展示,很簡單,此處略過。

//MainActivity.java
package com.example.wang.client;
...
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 private List<OrderBean> orderList;
 private IOrderManager orderManager;
 //UI
 private Button search_button;
 private Button add_button;
 private RecyclerView recyclerView;
 private OrderAdapter adapter;

 ServiceConnection conn = new ServiceConnection() {//這個最重要,用于連接Service
 @Override
 public void onServiceConnected(ComponentName name, IBinder service) {
  Log.i("MainActivity.conn","@@ onServiceConnected name="+name);
  IOrderManager manager = IOrderManager.Stub.asInterface(service);
  orderManager = manager;
  refreshOrderList();
  try {
  service.linkToDeath(deathRecipient, 0);
  } catch (RemoteException e) {
  e.printStackTrace();
  }
 }

 @Override
 public void onServiceDisconnected(ComponentName name) {
  Log.i("MainActivity.conn","@@ onServiceDisconnected name="+name);
 }
 };
 IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {//注冊一個死亡代理,監(jiān)測連接狀態(tài)
 @Override
 public void binderDied() {
  Log.i("MainActivity","@@ binderDied "+(orderManager==null));
  if(orderManager==null){
  return;
  }
  orderManager.asBinder().unlinkToDeath(deathRecipient, 0);
  orderManager = null;
  //重新綁定
  bindOrderService();
 }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Log.i("MainActivity","@@ onCreate");
 setContentView(R.layout.activity_main);
 getLayoutInflater();
 //view
 search_button=findViewById(R.id.search_button);
 add_button=findViewById(R.id.add_button);
 recyclerView=findViewById(R.id.recyclerView);
 //組裝recyclerView
 LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
 linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
 recyclerView.setLayoutManager(linearLayoutManager);
 adapter=new OrderAdapter(this);
 recyclerView.setAdapter(adapter);
 //onclick
 search_button.setOnClickListener(this);
 add_button.setOnClickListener(this);
 //bind
 bindOrderService();
 }
 private void bindOrderService(){
 Intent intent = new Intent("com.example.wang.ordermanager.OrderService");
 intent.setPackage("com.example.wang.ordermanager");
 intent.addCategory(Intent.CATEGORY_LAUNCHER);
 bindService(intent, conn, Context.BIND_AUTO_CREATE);
 }
 /**
 * 重新獲取數(shù)據(jù)并刷新列表。
 */
 private void refreshOrderList(){
 try {
  if(orderManager!=null){
  orderList = orderManager.getAll();
  }
  if(orderList!=null){
  adapter.setData(orderList);
  adapter.notifyDataSetChanged();
  }
 } catch (RemoteException e) {
  e.printStackTrace();
 }
 }

 @Override
 public void onClick(View v) {
 if(v==search_button){
  //刷新訂單
  refreshOrderList();
 }else if(v==add_button){
  //增加訂單
  try {
  OrderBean orderBean=new OrderBean();
  Random random=new Random();
  orderBean.setAmount(random.nextInt(800)+100);
  orderBean.setId(random.nextInt(100000000)+100000+"");
  orderBean.setName("玩具"+random.nextInt());
  orderManager.add(orderBean);
  refreshOrderList();
  } catch (RemoteException e) {
  e.printStackTrace();
  }
 }
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 unbindService(conn);
 }
}

4、編寫服務(wù)端代碼

這里主要做兩件事,第一個是移植aidl文件和bean類,將client中的aidl文件和OrderBean移植過來,文件路徑要保持一致,第二個是編寫OrderService.java類。

//OrderService.java
package com.example.wang.ordermanager;
...

public class OrderService extends Service{
 private CopyOnWriteArrayList<OrderBean> list = new CopyOnWriteArrayList<>();

 @Override
 public void onCreate() {
 super.onCreate();
 Log.i("OrderService","@@ onCreate");

 }

 @Nullable
 @Override
 public IBinder onBind(Intent intent) {
 Log.i("OrderService","@@ onBind");
 return binder;
 }

 Binder binder = new IOrderManager.Stub(){

 @Override
 public List<OrderBean> getAll() throws RemoteException {
  return list;
 }

 @Override
 public void add(OrderBean bean) throws RemoteException {
  list.add(bean);
 }
 };

}


OrderService服務(wù)在AndroidManifest.xml中的配置如下:

<service android:name=".OrderService"
  android:enabled="true"
  android:exported="true">
  <intent-filter>
  <action android:name="com.example.wang.ordermanager.OrderService"/>
  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </service>

代碼編寫就完成了,運行時需要先運行服務(wù)端app,再運行client,如果運行過程中OrderService服務(wù)斷掉了,client會通過死亡代理得到通知,再重新綁定即可。

運行如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android Textview實現(xiàn)顏色漸變滾動效果

    Android Textview實現(xiàn)顏色漸變滾動效果

    這篇文章主要為大家詳細介紹了Android Textview實現(xiàn)顏色漸變滾動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • android支付寶客戶端html5網(wǎng)頁無法自動關(guān)閉問題的解決方法

    android支付寶客戶端html5網(wǎng)頁無法自動關(guān)閉問題的解決方法

    這篇文章主要為大家詳細介紹了android支付寶客戶端html5網(wǎng)頁無法自動關(guān)閉問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android網(wǎng)絡(luò)開發(fā)中GET與POST請求詳解

    Android網(wǎng)絡(luò)開發(fā)中GET與POST請求詳解

    這篇文章主要介紹了android實現(xiàn)網(wǎng)絡(luò)請求的get和post請求的簡單封裝與使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧<BR>
    2022-12-12
  • Android實現(xiàn)儀表盤效果

    Android實現(xiàn)儀表盤效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)儀表盤效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android控件AppWidgetProvider使用方法詳解

    Android控件AppWidgetProvider使用方法詳解

    這篇文章主要為大家詳細介紹了Android控件AppWidgetProvider的使用方法詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android自定義水波紋底部導(dǎo)航的實現(xiàn)

    Android自定義水波紋底部導(dǎo)航的實現(xiàn)

    TabLayout作為導(dǎo)航組件來說,使用場景非常的多,也意味著要滿足各種各樣的需求,這篇文章主要介紹了Android自定義水波紋底部導(dǎo)航的實現(xiàn)
    2022-08-08
  • Android自定義流式布局的實現(xiàn)示例

    Android自定義流式布局的實現(xiàn)示例

    這篇文章主要介紹了Android自定義流式布局的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-12-12
  • Android中使用am命令實現(xiàn)在命令行啟動程序詳解

    Android中使用am命令實現(xiàn)在命令行啟動程序詳解

    這篇文章主要介紹了Android中使用am命令實現(xiàn)在命令行啟動程序詳解,本文詳細講解了am命令的語法,然后給出了啟動內(nèi)置程序的操作實例,需要的朋友可以參考下
    2015-04-04
  • 理解Android中的自定義屬性

    理解Android中的自定義屬性

    這篇文章主要介紹了理解Android中的自定義屬性,在android相關(guān)應(yīng)用開發(fā)過程中,固定的一些屬性可能滿足不了開發(fā)的需求,所以需要自定義控件與屬性,本文將以此問題進行詳細介紹,需要的朋友可以參考下
    2016-01-01
  • 詳解Android權(quán)限管理之Android 6.0運行時權(quán)限及解決辦法

    詳解Android權(quán)限管理之Android 6.0運行時權(quán)限及解決辦法

    本篇文章主要介紹Android權(quán)限管理之Android 6.0運行時權(quán)限及解決辦法,具有一定的參考價值,有興趣的可以了解一下。
    2016-11-11

最新評論