歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Studio實現Service AIDL

今天要開發過程中要用到AIDL的調用,之前用的eclipse有大量教程,用起來很方便,現在剛換了Android studio,不可否認studio真的很強大,只是很多功能還需要摸索。

AIDL(Android Interface Definition Language)是Android接口定義語言的意思,它可以用於讓某個Service與多個應用程序組件之間進行跨進程通信,從而可以實現多個應用程序共享同一個Service的功能。

言歸正傳,今天的主題是遠程Service建立AIDL進行通信,通過一個小demo來展示AIDL在Android studio中的實現:

1. 搭建了一個簡單的Service框架,僅包括startService(intent),框架在後面代碼中展示出來

2. 然後建立AIDL,通過點擊建立AIDL文件,如圖

建立好之後,出現AIDL文件如圖

但是此時並沒有AIDL的java文件產生,其實android studio也是帶有自動生成的,只不過需要確認一些信息後才能生成。此時,我們可以在目錄 build-->generated-->source-->aidl-->test-->debug下面發現還沒有任何文件

此時,打開AndroidManifest.xml,確認package的值,如我這個

                                           

關鍵性的一步,確認aidl文件所在的包名和AndroidMainifest.xml的package名是否一致。如果一致,點擊 Build-->Make Project,生成相應的java文件。如果不一致,則改aidl的包名,改成一致,再點擊生成,生成效果如圖。

則此時就可以在程序中通過AIDL調用遠程Service的方法,實現AIDL與遠程Service進行通信,代碼展示如下。

MainActivity.java

public class MainActivity extends ActionBarActivity {

    private MyServiceAIDL myServiceAIDL;
    private Intent binderIntent;
    private final static boolean create_flag=true;
    private final static boolean destory_flag=false;
    private final static String TAG="MainActivity";

    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myServiceAIDL = MyServiceAIDL.Stub.asInterface(service);
            try {
                //通過AIDL遠程調用
                Log.d(TAG,"++start download++");
                myServiceAIDL.DownLoad();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG,"++MainActivity onCreate++");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //開啟服務
        Intent intent = new Intent(this, MainService.class);
        startService(intent);

        //連接遠程Service和Activity
        binderIntent = new Intent(this,MainService.class);
        Bundle bundle = new Bundle();
        bundle.putBoolean("flag",create_flag);
        binderIntent.putExtras(bundle);
        bindService(binderIntent, sc, BIND_AUTO_CREATE);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"++MainActivity onDestroy++");

        boolean flag = false;
        //暫停服務
        Intent intent = new Intent(this, MainService.class);
        stopService(intent);

        //斷開與遠程Service的連接
        unbindService(sc);
    }
}

MainService.java

public class MainService extends Service {

    boolean flag;
    private final static String TAG = "MainService";

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "++MainService onDestroy++");
        flag = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "++MainService onCreate++");

        Notification no = new Notification(R.drawable.ic_launcher, "有通知到來", System.currentTimeMillis());
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
        no.setLatestEventInfo(this, "AIDLDemo", "running", pi);
        startForeground(1, no);
    }

    @Override
    public IBinder onBind(Intent intent) {

        Bundle bundle = intent.getExtras();
        flag = bundle.getBoolean("flag");
        System.out.println(flag);
        return ms;
    }

    MyServiceAIDL.Stub ms = new MyServiceAIDL.Stub() {
        @Override
        public void DownLoad() throws RemoteException {

            new Thread(new Runnable() {
                int i = 0;

                @Override
                public void run() {
                    //未達到線程條件,會一直在後台運行,就算服務已經關閉
                    while (flag) {

                        try {
                            i++;
                            System.out.println("i的值是" + i);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("退出服務");
                }
            }).start();

        }
    };
}

AndroidManifest.xml

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".MainService"
            android:process=":remote"></service>
    </application>

MyServiceAIDL.aidl

// myServiceAIDL.aidl
package com.example.wanghao.aidldemo;

// Declare any non-default types here with import statements

interface MyServiceAIDL {

    void DownLoad();
}

Ubuntu 12.04(64位)安裝Android Studio 全過程 http://www.linuxidc.com/Linux/2013-05/84812.htm 

Android Studio v0.1嘗鮮 http://www.linuxidc.com/Linux/2013-05/84681.htm 

Android Studio使用教程 http://www.linuxidc.com/Linux/2013-05/84579.htm 

Android Studio開發指南 http://www.linuxidc.com/Linux/2013-05/84543.htm 

Android Studio設置主題 和 不支持中文的問題解決方法 http://www.linuxidc.com/Linux/2013-05/84488.htm 

Android Studio 下載安裝以及不能打開的解決辦法 http://www.linuxidc.com/Linux/2013-05/84409.htm 

Android Studio安裝使用圖文教程 http://www.linuxidc.com/Linux/2014-09/106914.htm 

Copyright © Linux教程網 All Rights Reserved