1. 程式人生 > >Android Studio AIDL建立案例(解決自動生成java問題)

Android Studio AIDL建立案例(解決自動生成java問題)

AIDL建立

  1. 新建Aidldemo專案

    這裡寫圖片描述

  2. 選中APP-右鍵-new-AIDL-AIDL file
    這裡寫圖片描述

    會出現一個aidl目錄,但是注意此時還沒有生成對應的java檔案,如下圖所示
    這裡寫圖片描述

  3. 點選Build-Clean Project(Rebuild 也可以),aidl對應的java檔案就會出現了
    這裡寫圖片描述

寫個加法計算器

  • 更改aidl目錄下的aidl檔案如下:

    interface IAdditionService {
        int add(in int x, in int y);
    }
  • 在MainActivity同級目錄下,建立一個Service

    這裡寫圖片描述

    更改程式碼如下:

    public
    class AdditionService extends Service { public AdditionService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return mBinder; } IAdditionService.Stub mBinder = new IAdditionService.Stub() { @Override
    public int add(int x, int y) throws RemoteException { return x + y; } }; }
  • 寫個簡單的佈局,輸入兩個加數,點選按鈕相加,並輸出結果

    ```
    <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 +"");
    }
}

執行結果:
這裡寫圖片描述