- 浏览: 411595 次
文章分类
- 全部博客 (327)
- Android (114)
- Java (13)
- Java基础 (14)
- Glib (2)
- linux (15)
- extjs (5)
- eclipse (2)
- Asterisk (56)
- MYSQL (6)
- 数据库 (9)
- PHP (7)
- C# (18)
- 杂谈~~ (1)
- web开发前端 (3)
- 网络编程 (2)
- Opensips (2)
- voip (3)
- debian (7)
- openfire (15)
- wordpress (1)
- 版本控制 (1)
- Android 线程服务广播 (1)
- SRTP (2)
- 单片机及ARM等 (3)
- 基础知识 (5)
- asp.net (2)
- 单片机 (1)
- 设计模式及架构 (1)
- 安全 (1)
- Cubieboard 草莓树莓各类派 Android开发板 (1)
- J2EE (2)
- BootStrap (3)
- BootStrap web前端开发 (1)
- web前端开发 (4)
- object-c (1)
- openwrt (8)
- 智能家居 (4)
- Node.js (4)
最新评论
-
xiaoxiecomeon:
你这个程序一存在线程的时间片相互抢占的问题,运行时间长了很可能 ...
Runnable 和 Thread -
dotjar:
我觉得话应该这么说:引用TestThread tt = new ...
Runnable 和 Thread -
dagf113225:
调用TelephonyManager的隐藏API是先参考Fra ...
Android提高第十四篇之探秘TelephonyManager
在AIDL中让Service调用Activity的方法 然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder 接下来是service: 然后是activity: 最后不要忘记在manifest中加上service标记:
代码:
首先建立一个ICallback.aidl文件,作为Activity中的回调方法
2
3 interface ICallback {
4 void showResult(int result);
5 }
注意:aidl中import不能写com.xxx.*,要写全类的路径
2
3 import com.zhang.test.service.ICallback;
4
5 interface IService {
6 void registerCallback(ICallback cb);
7 void unregisterCallback(ICallback cb);
8 }
MainService.java
2
3 import android.app.Service;
4 import android.content.Intent;
5 import android.os.Handler;
6 import android.os.IBinder;
7 import android.os.Message;
8 import android.os.RemoteCallbackList;
9 import android.os.RemoteException;
10 import android.util.Log;
11
12 public class MainService extends Service {
13
14 private static final String TAG = "MainService";
15
16 private RemoteCallbackList<icallback> mCallbacks = new RemoteCallbackList<icallback>();
17
18 private IService.Stub mBinder = new IService.Stub() {
19
20 @Override
21 public void unregisterCallback(ICallback cb){
22 if(cb != null) {
23 mCallbacks.unregister(cb);
24 }
25 }
26
27 @Override
28 public void registerCallback(ICallback cb){
29 if(cb != null) {
30 mCallbacks.register(cb);
31 }
32 }
33 };
34
35 @Override
36 public IBinder onBind(Intent intent) {
37 Log.d(TAG, "onBind");
38 return mBinder;
39 }
40
41 @Override
42 public void onCreate() {
43 Log.d(TAG, "onCreate");
44 //这里不知道为什么,直接使用callback方法回调showResult
45 //mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
46 //也许是在activity中binService太耗时的原因?
47 mHandler.sendEmptyMessageDelayed(0, 1000);
48 super.onCreate();
49 }
50
51 @Override
52 public void onDestroy() {
53 mHandler.removeMessages(0);
54 mCallbacks.kill();
55 super.onDestroy();
56 }
57
58 private void callBack() {
59 int N = mCallbacks.beginBroadcast();
60 try {
61 for (int i = 0; i < N; i++) {
62 mCallbacks.getBroadcastItem(i).showResult(i);
63 }
64 } catch (RemoteException e) {
65 Log.e(TAG, "", e);
66 }
67 mCallbacks.finishBroadcast();
68 }
69
70 private Handler mHandler = new Handler() {
71
72 @Override
73 public void handleMessage(Message msg) {
74 callBack();
75 super.handleMessage(msg);
76 }
77 };
78 }
79 </icallback></icallback>
2
3 import android.app.Activity;
4 import android.content.ComponentName;
5 import android.content.Context;
6 import android.content.Intent;
7 import android.content.ServiceConnection;
8 import android.os.Bundle;
9 import android.os.IBinder;
10 import android.os.RemoteException;
11 import android.util.Log;
12
13 import com.zhang.test.service.ICallback;
14 import com.zhang.test.service.IService;
15 import com.zhang.test.service.MainService;
16
17 public class MainActivity extends Activity {
18
19 private static final String TAG = "MainActivity";
20
21 private IService mService;
22
23 /** Called when the activity is first created. */
24 @Override
25 public void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.main);
28 Intent i = new Intent(this, MainService.class);
29 bindService(i, mConnection, Context.BIND_AUTO_CREATE);
30 }
31
32 @Override
33 protected void onDestroy() {
34 if(mService!=null){
35 try {
36 mService.unregisterCallback(mCallback);
37 } catch (RemoteException e) {
38 Log.e(TAG, "", e);
39 }
40 }
41 //destroy的时候不要忘记unbindService
42 unbindService(mConnection);
43 super.onDestroy();
44 }
45
46 /**
47 * service的回调方法
48 */
49 private ICallback.Stub mCallback = new ICallback.Stub() {
50
51 @Override
52 public void showResult(int result) {
53 Log.d(TAG, " result : " + result);
54 }
55 };
56
57 /**
58 * 注册connection
59 */
60 private ServiceConnection mConnection = new ServiceConnection() {
61
62 @Override
63 public void onServiceDisconnected(ComponentName name) {
64 Log.d(TAG, "onServiceDisconnected");
65 mService = null;
66 }
67
68 @Override
69 public void onServiceConnected(ComponentName name, IBinder service) {
70 Log.d(TAG, "onServiceConnected");
71 mService = IService.Stub.asInterface(service);
72 try {
73 mService.registerCallback(mCallback);
74 } catch (RemoteException e) {
75 Log.e(TAG, "", e);
76 }
77 }
78 };
79 }
2 </service>
总结:
通过aidl总算实现了Service与Activity的通信,写起来麻烦点,使用诸如ContentProvider,Broadcast等也可以实现.
这样做很像是在使用MVC设计模式(Activity负责View,Service以及其他类负责 Model,aidl(ServiceConnection)负责Controller)
发表评论
-
直接拿来用!最火的Android开源项目整理
2015-09-16 10:13 600一、代码库 1、from 代码家 整理比较好的源 ... -
探讨android更新UI的几种方法
2014-06-09 23:27 615今天讲的内容非常简单,只是讲讲有关于android界面更新的 ... -
Android 滑动切换页面 以及屏幕手势
2014-05-08 17:49 525手机进入智能机时代,触摸屏也已成为主流之势,原来的手机按键也 ... -
android 用Achartengine 作图
2014-05-08 16:55 760Achartengine 是google的一 ... -
Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
2014-05-08 16:28 768Animation的4个基本动画效果 What is An ... -
java.lang.ClassNotFoundException: Didn't find class "android.support.v4.view.Vie
2014-05-06 14:43 2931Android错误:Caused by: java.lang ... -
Android Socket通信如何设置超时时间
2014-05-06 14:14 1079其实关于这个问题可能用到的人不会很多,不过我在这里还是说说。 ... -
【转】Android本地语音识别引擎PocketSphinx-语言建模
2014-02-13 10:35 1829Android本地语音识别引擎PocketSphinx- ... -
关于build.prop原始Dalvik虚拟机设定与调整
2013-09-05 10:40 1260原厂S3 台版 1GB Ramsystem/build.pro ... -
Android中Service与IntentService的使用比较
2013-09-04 15:24 1202该博客来自网络——— ... -
android 应用程序Activity之间数据传递与共享的几种途径
2013-08-01 17:24 9051.基于消息的通信机制 Intent ---boud ... -
android数据通信方式
2013-08-01 17:15 911http://www.itkee.com/develope ... -
“android.intent.category.DEFAULT”的目的是什么?
2013-07-31 16:43 5381、要弄清楚这个问题,首先需要弄明白什么是implicit( ... -
集成拨号盘,2句话的事情
2013-07-30 15:45 601<intent-filter> < ... -
Android TabHost动态加载内容总结
2013-07-25 17:49 954前面用继承TabActivity的方法很好的完成了,TabHo ... -
[Android实例] android json
2013-07-17 15:20 653import java.io.ByteArrayOutput ... -
android json解析及简单例子
2013-07-17 15:19 931JSON的定义: 一种轻量级的数据交换 ... -
AsyncTask的用法-UI刷新发放
2013-07-15 14:50 665在开发Android应用时必须遵守单线程模型的原则: A ... -
java.lang.OutOfMemoryError处理错误
2013-07-15 14:41 671java.lang.OutOfMemoryError异常解决 ... -
关于android.view.WindowLeaked异常的解决方案
2013-07-15 10:34 613Android.view.WindowLeaked按字面了解, ...
相关推荐
本文将深入探讨如何在Activity中使用AIDL来让Service与Activity进行通信。 首先,我们需要了解AIDL的基本概念。AIDL是一种特殊的接口定义语言,它允许Android系统生成必要的Java绑定类和代理对象,以便在不同的进程...
6. **在Activity中使用Service**: Activity需要获取Service的IBinder接口,然后通过这个接口调用Service中的方法。首先,通过`bindService`方法连接到Service,然后在回调的`onServiceConnected`方法中,你可以...
标题“aidl双向通信,Service加回调刷新自身Activity”涉及了两个关键概念:AIDL的双向通信以及通过Service回调更新Activity。 首先,让我们深入理解AIDL。AIDL是用来定义接口的,这些接口可以让一个Android进程...
本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...
在Android开发中,Activity与Service之间的通信是应用中常见的需求,尤其当Service运行在远程进程中时,这种通信机制显得尤为重要。AIDL(Android Interface Definition Language)是Android提供的一种接口定义语言...
3. Activity绑定Service并使用Binder:在Activity中,我们可以通过bindService()方法绑定到Service,并在onServiceConnected()回调中获取到Binder对象。之后就可以调用Service中定义的方法了。 ```java public ...
本篇文章将深入探讨如何在Android Studio中使用AIDL来实现跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL是一种接口定义语言,它允许开发者声明服务端提供的接口,客户端通过这些接口调用服务端的方法,实现...
在Android系统中,AIDL(Android Interface Definition Language)是用于定义跨进程通信(IPC, Interprocess Communication)接口的一种语言。通过AIDL,开发者可以创建服务(Service),使得其他应用程序组件能够与...
- 连接成功后的操作:在`ServiceConnection`的`onServiceConnected()`回调中,我们可以获取到Service的Binder对象,从而调用Service的方法。 - 解绑Service:当不再需要与Service交互时,记得调用`unbindService()...
AIDL(Android Interface Definition Language)是Android提供的一种工具,用于支持跨进程调用,让服务(Service)可以在不同的进程中运行并与其他应用进行交互。本教程将通过一个简单的例子来讲解如何使用AIDL实现...
本示例代码将探讨如何在Android应用中使用Service和AIDL。 1. **Service基础** - **Service生命周期**:Service有其特定的生命周期,包括onCreate(), onStartCommand(), onBind(), onRebind(), onUnbind(), 和 ...
AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,交换数据,即使它们运行在不同的进程中。在“Aidldemo”中,我们可以看到一个服务端(AIDLServer)和客户端(AIDLClient)的示例,这是...
总之,观察者模式在Android开发中扮演着重要的角色,尤其在Service与Activity的交互中,能够优雅地处理数据变化的传播,提高代码的可读性和可维护性。在"ObservableDemo"项目中,我们可以通过阅读和分析源码,更深入...
5. 绑定服务:在客户端,使用bindService()方法连接服务,然后在回调中获取服务接口实例。 6. 调用服务:通过接口实例调用服务端的方法,进行跨进程通信。 示例: ```aidl package com.example.aidldemo; // 声明...
在这个实例中,`onServiceConnected`回调中,我们通过`Stub.asInterface(service)`获取到服务端的接口实现,然后就可以调用`sendMessage`和`receiveMessage`了。如果在调用过程中发生异常,通常是因为进程间的通信...
通过这个AIDL_DEMO,我们可以学习到如何在Android应用中使用AIDL实现进程间通信。这不仅适用于简单数据传递,还可以处理更复杂的对象交互,是Android开发中不可或缺的一部分。在实际项目中,根据需求灵活运用AIDL,...
总结来说,AIDL是Android中实现进程间通信的有效工具,特别是当需要在独立进程中运行服务并进行回调时。通过定义接口、实现接口、设置服务进程以及绑定服务,我们可以创建出高效且稳定的跨进程通信解决方案。在实际...
在Android系统中,AIDL(Android Interface Definition Language)和Service是两个重要的组件,它们分别用于进程间通信(IPC,Inter-Process Communication)和后台服务执行。本篇文章将深入探讨AIDL的工作原理以及...