在上一篇文章中講解了如何利用Messenger和Binder類來實現與Activity的通信,這次就講解下其他的兩種通訊方式。不管是哪一種通訊,我們首先需要創建一個Service,下面就先創建一個Service,看過上一篇文章的就可以直接跳過這裏。
Service的創建
1.創建MySerVice類繼承Service並重寫相關方法
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
2.註冊清單配置文件
<application>
...
<service android:name=".MyService" />
</application>
一、使用廣播通訊
在Android的系統中,廣播是大家經常用到的組件,比如我們希望一個軟件在開機的時候就自動重啓,其實就是利用了系統啓動時發出的廣播,我們接受到這個廣播就開始運行我們的程序。這裏只會簡單使用廣播機制,不會過多的闡述廣播的實現,有需要的話我會在以後另外貼出。下面就開始使用它來完成我們的通訊:
1.activity_main.xml
添加兩個按鈕便於測試
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick01"
android:text="啓動" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick02"
android:text="停止" />
</LinearLayout>
2.MainActivity.java
創建內部類繼承BroadcastReceiver來實現廣播消息的處理,並在Activity加載時註冊廣播
public class MainActivity extends Activity {
//用於測試數據
private int count;
//Service的Intent對象
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent=new Intent(this, MyService.class);
//註冊廣播
MyReceiver receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("com.receiver");
registerReceiver(receiver, filter);
}
/**
* 啓動服務
* @param v
*/
public void onClick01(View v){
startService(intent);
}
/**
* 停止服務
* @param v
*/
public void onClick02(View v){
stopService(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
stopService(intent);
}
/**
* 內部內實現廣播接口
* @author mm
*
*/
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Tag","count="+count++);
}
}
}
2.MyService.java
在service啓動時,利用定時器不停的給Activity發送廣播
public class MyService extends Service {
private Intent intent;
// 創建定時器對象
private Timer mTimer;
public MyService() {
}
/**
* 指定時間執行的任務類
*
* @author mm
*
*/
class MyTimerTask extends TimerTask {
@Override
public void run() {
Log.i("Tag", "sendBroadcast");
// 發送廣播
sendBroadcast(intent);
}
}
@Override
public void onCreate() {
super.onCreate();
// 關聯廣播的Action
intent = new Intent("com.receiver");
mTimer = new Timer();
// 每隔一秒發送一次廣播
mTimer.schedule(new MyTimerTask(), 0, 1000);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
/**
* service銷燬時,關閉定時器mTimer
*/
@Override
public void onDestroy() {
super.onDestroy();
mTimer.cancel();
}
}
程序運行結果圖:
二、使用AIDL交互
AIDL是Android Interface Definition Language的首字母縮寫, 也就是Android接口定義語言。AIDL屬於Android的IPC機制,常用於跨進程通信,主要實現原理基於底層Binder機制。
1、創建AIDLService端
1.1IDataService.aidl
在指定包中,創建文件IDataService.aidl文件,內容如下:
package com.example.adilservice;//包名
interface IDataService{
//自定義方法
String getData();
}
保存後會在gen目錄下生成IDataService.java文件,如下圖所示
1.2ADILService.java
創建ADILService,返回綁定參數
public class ADILService extends Service {
class AIDLServerBinder extends IDataService.Stub {
@Override
public String getData() throws RemoteException {
return "data on service";
}
}
@Override
public IBinder onBind(Intent intent) {
return new AIDLServerBinder();
}
}
運行程序,使該Service駐留在手機內
2、創建ADILClient端
在使用前需要將aidl文件文件拿過來,如下圖所示
2.1.activity_main.xml
在佈局文件中加入一個按鈕。便於測試
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="talk"
android:onClick="onClick"/>
2.2.MainActivity.java
public class MainActivity extends Activity {
private IDataService iDataService;
private ServiceConnection conn = new ServiceConnection() {
//綁定異常執行
@Override
public void onServiceDisconnected(ComponentName name) {
}
//綁定成功執行
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iDataService=IDataService.Stub.asInterface(service);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v){
String data=null;
try {
data=iDataService.getData();
} catch (RemoteException e) {
e.printStackTrace();
}
Log.i("Tag", "data="+data);
}
@Override
protected void onStart() {
super.onStart();
bindService(new Intent("com.example.adilservice"), conn,
BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
小結
service的數據交互到這就告一段落了,以後要有其他新的方法還會再次給出。如果有問題請幫忙指出 :)