今天要開發過程中要用到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(); }
參考文章:http://blog.csdn.net/guolin_blog/article/details/9797169
Android開發愛好者,文中如果有錯誤之處,望大神們留言指出,相互學習,共同進步!
