android 进程间通信示例
来源:互联网 发布:新概念2 3 4教材知乎 编辑:程序博客网 时间:2024/04/28 15:16
http://blog.csdn.net/liushaogeng/article/details/5866397
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:
1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:
package android.ipc;
// Declare the interface.
interface IDateTimeService {
String getCurrentDataTime();
}
2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:
package android.ipc;
import android.content.Intent;
import android.app.Service;
import java.util.Date;
import android.os.IBinder;
public class DateTimeService extends Service {
public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";
/**
* 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
* sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有 Activity注册的接收者进行处理;
*/
private Intent broadcast = new Intent(BROADCAST_ACTION);
private final IDateTimeService.Stub binder = new IDateTimeService.Stub() {
public String getCurrentDataTime() {
return (getCurrentDataTimeImpl());
}
};
synchronized private String getCurrentDataTimeImpl() {
Date date = new Date();
return (date.toLocaleString());
}
@Override
public IBinder onBind(Intent intent) {
sendBroadcast(broadcast);
return (binder);
}
}
3.现在编写一个Activity,来消费这个服务:
package android.ipc;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.webkit.WebView;
import android.content.ServiceConnection;
import android.content.ComponentName;
import android.os.IBinder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
public class ipc extends Activity {
private IDateTimeService service = null;
private Intent serviceIntent = null;
private WebView browser;
private ServiceConnection svcConn = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
service = IDateTimeService.Stub.asInterface(binder);
browser.postDelayed(new Runnable() {
public void run() {
updateForecast();
}
}, 1000);
}
public void onServiceDisconnected(ComponentName className) {
service = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
browser = (WebView) findViewById(R.id.WebView);
serviceIntent = new Intent(this, DateTimeService.class);
// 绑定一个服务
bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);
}
@Override
public void onResume() {
super.onResume();
/**
* 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由 Activity注册的接收者
* 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
* DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
*/
registerReceiver(receiver, new IntentFilter(
DateTimeService.BROADCAST_ACTION));
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
@Override
public void onDestroy() {
super.onDestroy();
unbindService(svcConn);
}
private void updateForecast() {
try {
String page = service.getCurrentDataTime();
if (page != null) {
browser.loadDataWithBaseURL(null, page, "text/html", "UTF- ",
null);
browser.postDelayed(new Runnable() {
public void run() {
updateForecast();
}
}, 1000);
}
} catch (final Throwable t) {
svcConn.onServiceDisconnected(null);
}
}
// 接收者实例
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
runOnUiThread(new Runnable() {
public void run() {
updateForecast();
}
});
}
};
}
参考:http://alex-yang-xiansoftware-com.javaeye.com/blog/607109
- android 进程间通信示例
- android 进程间服务通信示例
- android进程间服务通信示例
- Android进程间服务通信示例
- Android进程间通信
- Android 进程间通信
- Android进程间通信
- android进程间通信
- Android进程间通信
- Android进程间通信
- Android进程间通信
- Android 进程间通信
- Android 进程间通信
- Android 进程间通信
- android进程间通信
- android 进程间通信
- android进程间通信
- Android 进程间通信
- JSON Introduction
- Android面试复习知识点
- android 线程间的通信
- 网上程序DEMO
- CFRunLoop介绍(转载)
- android 进程间通信示例
- 获得内存卡的剩余内存
- 导出数据库文件oracle
- SQL 2000 服务器和网页服务器网络异常
- java调用ocx
- 两分钟彻底让你明白Android Activity生命周期(图文)
- Remove watermark in Wow Slider 2.1.3
- VISUAL STUDIO 2008 自定义项目模板
- windows media player不支持播放地址跳转