使用android中的AIDL让Service与Activity通信
这几天搞了搞AIDL,终于弄明白了在AIDL中让Service调用Activity的方法
代码:
首先建立一个ICallback.aidl文件,作为Activity中的回调方法
view plaincopy to clipboardprint?
package com.zhang.test.service;
interface ICallback {
void showResult(int result);
}
然后再建立一个IService.aidl用来在Activity中接收Service回调,以及在Service中onBind时返回的Binder
注意:aidl中import不能写com.xxx.*,要写全类的路径
view plaincopy to clipboardprint?
package com.zhang.test.service;
import com.zhang.test.service.ICallback;
interface IService {
void registerCallback(ICallback cb);
void unregisterCallback(ICallback cb);
}
接下来是service:
MainService.java
view plaincopy to clipboardprint?
package com.zhang.test.service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
public class MainService extends Service {
private static final String TAG = "MainService";
private RemoteCallbackList<icallback> mCallbacks = new RemoteCallbackList<icallback>();
private IService.Stub mBinder = new IService.Stub() {
@Override
public void unregisterCallback(ICallback cb){
if(cb != null) {
mCallbacks.unregister(cb);
}
}
@Override
public void registerCallback(ICallback cb){
if(cb != null) {
mCallbacks.register(cb);
}
}
};
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return mBinder;
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
//这里不知道为什么,直接使用callback方法回调showResult
//mCallbacks.beginBroadcast()是0,需要用handler延迟1000毫秒
//也许是在activity中binService太耗时的原因?
mHandler.sendEmptyMessageDelayed(0, 1000);
super.onCreate();
}
@Override
public void onDestroy() {
mHandler.removeMessages(0);
mCallbacks.kill();
super.onDestroy();
}
private void callBack() {
int N = mCallbacks.beginBroadcast();
try {
for (int i = 0; i < N; i++) {
mCallbacks.getBroadcastItem(i).showResult(i);
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
mCallbacks.finishBroadcast();
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
callBack();
super.handleMessage(msg);
}
};
}
然后是activity:
view plaincopy to clipboardprint?
package com.zhang.test;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.zhang.test.service.ICallback;
import com.zhang.test.service.IService;
import com.zhang.test.service.MainService;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private IService mService;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i = new Intent(this, MainService.class);
bindService(i, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
if(mService!=null){
try {
mService.unregisterCallback(mCallback);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
}
//destroy的时候不要忘记unbindService
unbindService(mConnection);
super.onDestroy();
}
/**
* service的回调方法
*/
private ICallback.Stub mCallback = new ICallback.Stub() {
@Override
public void showResult(int result) {
Log.d(TAG, " result : " + result);
}
};
/**
* 注册connection
*/
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected");
mService = IService.Stub.asInterface(service);
try {
mService.registerCallback(mCallback);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
}
};
}
最后不要忘记在manifest中加上service标记:
view plaincopy to clipboardprint?
<service android:name=".service.MainService">
运行程序,查看Logcat
结果如下:
总结:
通过aidl总算实现了Service与Activity的通信,写起来麻烦点,使用诸如ContentProvider,Broadcast等也可以实现.
这样做很像是在使用MVC设计模式(Activity负责View,Service以及其他类负责Model,aidl(ServiceConnection)负责Controller),其实我对于aidl也是一知半解- -,明天研究下如何让activity去调用service中的方法.
分享到:
相关推荐
NULL 博文链接:https://aichixihongshi.iteye.com/blog/1211771
本例除了将音乐放在后台播放外,还实现了Activity中显示一个进度条,这个进度条要跟着Service中的MediaPlayer中的歌曲进度同步向前走,而且如果我点击进度条中的某一个位置,就让歌曲跳转到相应时间点继续播放。
Activity与远程Service通信,使用AIDL
Android:AIDL和远程Service调用 本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命。所以我们干脆拿一个音乐播放器中进度条的实例来说明一下AIDL和Remote Service的价值和使用方法...
Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程,Android系统采用了远程过程调用(RPC)方式来实现跨进程调用服务(Service),对于Service的跨进程调用需要...
我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL...
描述 :整理了下android中的aidl, 项目中主要是用作于Activity和Service之间进行跨进程的通信和调用,定义了几种基本类型的接口,其中涵盖了自定义参数类型的传递。 注意: 解压后有两个android程序,一个client端 ...
如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象. 说白了,...
我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL...
AndroidAIDLLearnDemo Android Studio中有关Android AIDL的简单实践 在Android Studio中使用AIDL的步骤 在模块中添加了新的AIDL文件,... 通过在第3步中持有的引用来调用Stub的方法,这意味着您是从远程调用该方法的。
首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能。 如图,我们点击“播放”时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用...
41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...
41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...
除了添加基本系统服务, 其中还包含添加JNI部分代码和App通过AIDL调用的演示Demo, 调用包含App调用服务端, 也包含服务端回调App, 也就是完成一个简单的双向通信. 注: 测试代码基于Android 7.1.1, 其他Android版本都...
8.2.5 Service与Activity通信 343 8.3 后台播放音乐 345 8.3.1 跨进程调用 345 8.3.2 创建AIDL接口文件 346 8.3.3 实现AIDL接口 347 8.3.4 绑定Service 351 8.3.5 调用IPC方法 352 8.4 小结 353
Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务...如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。 AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和...
了解Service的原理和用途 掌握进程内服务的管理方法 掌握服务的隐式启动和显式启动方法 了解线程的启动、挂起和停止方法 了解跨线程的界面更新方法 掌握跨进程服务的绑定和调用方法 了解AIDL语言的用途和语法