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

android 跨进程访问service方法

 
阅读更多

1.Intent 启动service Activity方法集合

 

 

2. Acitivity 访问自己进程的service用startService就可以了,访问其中的方法,可以new Service().Method(不推荐)或者通过继承Binder方式来实现。

    但是如果要访问系统service 或者 其他 进程(APK)的servcie的方法就要使用bindService +ASDL的方式。如果你只是简单的启动service而不使用service中的方法,则不需要使用ASDL。当然你也可以简单通过广播来实现通信。

 还有一种比较新鲜的方法“Messenger ”!但是Messenger是线程安全的,如果要多线程访问servcie就要使用ASDL 了。

 

 

 首先定义Service端,比如一个播放音乐的MediaPlaybackService.

 

 定义一个ASDL 文件。注意Open方法得参数,in 的含义,AIDL 和普通的java 接口语法还是有差别的。

 如果希望 这个ASDL被编译为Java接口文件。需要在Android.mk文件中替换LOCAL_SRC_FILES如下编译选项。

 这样就会在out/target/common/obj/APPS/Music _intermediates/src/src/com/android/music生成  IMediaPlaybackService.java(负责通信,有兴趣可以看一下源码)接口文件 和IMediaPlaybackService.P文件,不需要将该接口文件拷贝到工程目录,就可通过import com.android.music.IMediaPlaybackService;引用它了。

 

 

LOCAL_SRC_FILES := $(call all-java-files-under, src) \
        src/com/android/music/IMediaPlaybackService.aidl
 

 

 

package com.android.music;

import android.graphics.Bitmap;

interface IMediaPlaybackService
{
    void openFile(String path);
    void open(in long [] list, int position);
    int getQueuePosition();
    boolean isPlaying();
    void stop();
    void pause();
    void play();
    void prev();
    void next();
    long duration();
    long position();
    long seek(long pos);
    String getTrackName();
    String getAlbumName();
    long getAlbumId();
    String getArtistName();
    long getArtistId();
    void enqueue(in long [] list, int action);
    long [] getQueue();
    void moveQueueItem(int from, int to);
    void setQueuePosition(int index);
    String getPath();
    long getAudioId();
    void setShuffleMode(int shufflemode);
    int getShuffleMode();
    int removeTracks(int first, int last);
    int removeTrack(long id);
    void setRepeatMode(int repeatmode);
    int getRepeatMode();
    int getMediaMountedCount();
    int getAudioSessionId();
    void playAll(in long[] list, int position, boolean force);
}
 

编写音乐servcie代码:

MyBinder内部类也可以这样定义

 

 

public class MediaPlaybackService extends Service {

		private IBinder binder = new MyBinder(this);
		@Override
		public IBinder onBind(Intent intent) {
			return binder;
		}
		public String play(){
			//......
		}
		public class MyBinder extends  IMediaPlaybackService.Stub{

			 WeakReference<MediaPlaybackService> mService;

			 MyBinder(MediaPlaybackService service) {
		            mService = new WeakReference<MediaPlaybackService>(service);
		        }

			@Override
			public String play() {
				return  mService.play();
			}
			@Override
			protected boolean onTransact(int code, Parcel data, Parcel reply,
					int flags) throws RemoteException {
				return super.onTransact(code, data, reply, flags);
			}
		}
}
 

 

   修改Music Manifest.xml文件

 

<service android:name="com.android.music.MediaPlaybackService"
            android:exported="true" >
          <intent-filter>  
             <action         android:name="com.android.music.IMediaPlaybackService" />  
           </intent-filter>  
         </service>

 

 至此 ,服务器端工作完毕。

 

 

 

 

 

客户端调用流程:

将Music的IMediaPlaybackService.asdl文件拷贝到 客户端工程,注意需要在客户端工程中建立和服务端相同的包结构。

这和webservice很像。 同样修改Android.mk文件使其生成IMediaPlaybackService.java文件。

 

 

import com.android.music.IMediaPlaybackService;
public class HelloActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View view = getLayoutInflater().inflate(R.layout.hello_activity, null);
        setContentView(view);
        //注意:这个bindService不能在onclick方法中调用。service中进行耗时操作也要起线程。
        boolean issuccess = bindService(new Intent("com.android.music.IMediaPlaybackService"),
        		serviceConnection, Context.BIND_AUTO_CREATE);
        Button btn = (Button)this.findViewById(R.id.text);
        btn.setOnClickListener(new View.OnClickListener(){

			@Override
			public void onClick(View v) {
		
				try {
					myService.pause();
				} catch (RemoteException e) {
			
					e.printStackTrace();
				}
			}
        	
        });
    }
    IMediaPlaybackService myService = null;
    
    ServiceConnection serviceConnection = new ServiceConnection()
    {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			
			myService = IMediaPlaybackService.Stub.asInterface(service);
			//myService = (IMediaPlaybackService)service;//Wrong !!!跨进程不可行
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {
			serviceConnection = null;
		}
    };

}
 

 

分享到:
评论

相关推荐

    android中跨进程通讯的4种方式

    Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...

    详解Android 进程间通信的几种实现方式

    Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...

    Android AIDL实现跨进程通信的示例代码

    AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。 实现步骤 例:用 A程序去访问 B程序的MyService.java服务 在B中...

    Android服务Service详解

    服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之...

    Android服务Service_详解.pdf

    用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定 的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的 重要用途之一。

    疯狂Android讲义第10章源码(Android服务Service_详解)

     10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383  10.2.4 客户端访问AIDLService 385  10.3 电话管理器  ...

    Android Service的跨进程通信实战&Service/AIDL远程调用过程解析(Android Q)

    Service的跨进程通信实战 设想这么一个场景,我们有2个APP(或者2个进程,均可),其中一个APP需要提供一个Person相关的服务(该服务有一个名为eat的接口),我们叫它PersonServer;另一个APP需要访问PersonServer...

    AIDL示例(Android Interface Definition Language)

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

    详解android webView独立进程通讯方式

    webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏。 webView 在崩溃的时候不影响主进程。 webView独立进程需要注意什么 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建...

    Android服务Service_详解

    服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之...

    AIDL最简单的使用步骤

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

    《Android系统源代码情景分析》

    2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 ...

    android的服务

    以上代码调用了startService方法,Service会持续运行,直到调用stopService()或stopSelf()方法。 还有另一种绑定Service的方式: 1. … 2. ServiceConnection conn = new ServiceConnection() { 3. @Override 4. ...

    疯狂Android讲义(第2版)源代码 第10章~第13章

    10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:TelephoneManager; 10.4、短信管理器:SmsManager; 10.5、音频管理器:AudioManager; 10.6...

    Android系统源代码情景分析-罗升阳-源码

    2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 3.2.1 ...

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    Android 安卓手机电池电量监控代码.rar

     BatteryDog_Service继承了服务Service(后台运行和跨进程访问),创建了一个线程负责输出信息到文件,注册了广播接收器ACTION_BATTERY_CHANGED  BatteryDog继承了Activity 布局battery_dog 文件,主要负责启动/...

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍

    Android 系统 Linux系统 内核kernel启动流程 init 进程介绍,init进程初始化,内核启动三个阶段深入浅出介绍,简单易懂 。kernel_init() 函数介绍,ramdisk_execute_command,execute_command /sbin/init,/etc/init,...

    Android进程通信之Messenger和AIDL使用详解

    提到的进程间通信(IPC:Inter-Process Communication),在Android系统中,一个进程是不能直接访问另一个进程的内存的,需要提供一些机制在不同的进程之间进行通信,Android官方推出了AIDL(Android Interface ...

Global site tag (gtag.js) - Google Analytics