`
hou1000y
  • 浏览: 5180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

通过aidl service调用activity

阅读更多
使用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中的方法.
分享到:
评论
1 楼 rsic 2011-03-06  
谢谢分享,很受启发

相关推荐

    Activity中使用AIDL让Service与Activity通信

    NULL 博文链接:https://aichixihongshi.iteye.com/blog/1211771

    AIDL和远程Service调用实现音乐播放器

    本例除了将音乐放在后台播放外,还实现了Activity中显示一个进度条,这个进度条要跟着Service中的MediaPlayer中的歌曲进度同步向前走,而且如果我点击进度条中的某一个位置,就让歌曲跳转到相应时间点继续播放。

    Activity与远程Service通信,使用AIDL

    Activity与远程Service通信,使用AIDL

    Android AIDL和远程Service调用示例代码

    Android:AIDL和远程Service调用 本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命。所以我们干脆拿一个音乐播放器中进度条的实例来说明一下AIDL和Remote Service的价值和使用方法...

    Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程,Android系统采用了远程过程调用(RPC)方式来实现跨进程调用服务(Service),对于Service的跨进程调用需要...

    AIDL最简单的使用步骤

    我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL...

    android中aidl的基本应用

    描述 :整理了下android中的aidl, 项目中主要是用作于Activity和Service之间进行跨进程的通信和调用,定义了几种基本类型的接口,其中涵盖了自定义参数类型的传递。 注意: 解压后有两个android程序,一个client端 ...

    Android程序设计之AIDL实例详解

    如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象. 说白了,...

    AIDL示例(Android Interface Definition Language)

    我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL...

    AndroidAIDLLearnDemo:Android Studio中有关Android AIDL的简单实践

    AndroidAIDLLearnDemo Android Studio中有关Android AIDL的简单实践 在Android Studio中使用AIDL的步骤 在模块中添加了新的AIDL文件,... 通过在第3步中持有的引用来调用Stub的方法,这意味着您是从远程调用该方法的。

    实例讲解Android中的AIDL内部进程通信接口使用

    首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能。 如图,我们点击“播放”时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用...

    android开发demo集合

    41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...

    android初学者入门项目

    41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...

    Android 添加系统服务的方法详解

    除了添加基本系统服务, 其中还包含添加JNI部分代码和App通过AIDL调用的演示Demo, 调用包含App调用服务端, 也包含服务端回调App, 也就是完成一个简单的双向通信. 注: 测试代码基于Android 7.1.1, 其他Android版本都...

    ophone多媒体编程

    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 进程间通信实现原理分析

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务...如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

    android使用AIDL跨进程通信(IPC)

    如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。 AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和...

    android 后台服务.ppt

    了解Service的原理和用途 掌握进程内服务的管理方法 掌握服务的隐式启动和显式启动方法 了解线程的启动、挂起和停止方法 了解跨线程的界面更新方法 掌握跨进程服务的绑定和调用方法 了解AIDL语言的用途和语法

Global site tag (gtag.js) - Google Analytics