Android Studio AIDL建立案例(解決自動生成java問題)
阿新 • • 發佈:2019-01-23
AIDL建立
新建Aidldemo專案
選中APP-右鍵-new-AIDL-AIDL file
會出現一個aidl目錄,但是注意此時還沒有生成對應的java檔案,如下圖所示
點選Build-Clean Project(Rebuild 也可以),aidl對應的java檔案就會出現了
寫個加法計算器
更改aidl目錄下的aidl檔案如下:
interface IAdditionService { int add(in int x, in int y); }
在MainActivity同級目錄下,建立一個Service
更改程式碼如下:
public
寫個簡單的佈局,輸入兩個加數,點選按鈕相加,並輸出結果
``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="example.guanhang.aidldemo.MainActivity" tools:showIn="@layout/activity_main"> <EditText android:id="@+id/et_num1" android:layout_width="180dp" android:layout_gravity="center" android:layout_height="wrap_content" /> <EditText android:id="@+id/et_num2" android:layout_width="180dp" android:layout_gravity="center" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="add" android:text="相加" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="相加結果為:" /> <TextView android:id="@+id/tv" android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> ```
- 修改MainActivity的程式碼
public class MainActivity extends AppCompatActivity { IAdditionService mService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); Intent intentService = new Intent(this,AdditionService.class); bindService(intentService, mConnection, Context.BIND_AUTO_CREATE); } ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IAdditionService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; public void add(View view) throws RemoteException { EditText et1 = (EditText) findViewById(R.id.et_num1); EditText et2 = (EditText) findViewById(R.id.et_num2); TextView tv = (TextView) findViewById(R.id.tv); int x = Integer.parseInt(et1.getText().toString()); int y = Integer.parseInt(et2.getText().toString()); int result = mService.add(x, y); tv.setText(result +""); } }
結果
新建另一個專案,來啟動這個遠端服務
新建StartAdd 專案,在該專案啟動Aidldemo中的加法服務,佈局照抄上面那個專案
不過這個專案因為沒有Service的類,所以要在之前的那個專案中,加上隱式啟動服務的過濾器
注意:該專案新建的aidl要和之前專案的aidl包名以及檔案內容要一模一樣,所以這時不能右鍵新建AIDL file了(因為,這樣預設的包名是當前專案的包名,和之前的aidl的檔案的package是不符的)。因此要:
- 新建一個包,名字和上面專案Aidl所在的包名一致
- 把上面那個專案的aidl檔案直接拷到這個包裡面
- Clean Project ,自動生成相應的java檔案
修改MainActivity:
public class MainActivity extends AppCompatActivity {
IAdditionService mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
Intent intent = new Intent();
intent.setAction("com.guanhang.add");
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IAdditionService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
public void add(View view) throws RemoteException {
EditText et1 = (EditText) findViewById(R.id.et_num1);
EditText et2 = (EditText) findViewById(R.id.et_num2);
TextView tv = (TextView) findViewById(R.id.tv);
int x = Integer.parseInt(et1.getText().toString());
int y = Integer.parseInt(et2.getText().toString());
int result = mService.add(x, y);
tv.setText(result +"");
}
}
執行結果: