`
yzyspy
  • 浏览: 82192 次
  • 性别: 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种方式

    - 对于需要返回复杂Java对象的情况,可以使用AIDL(Android Interface Definition Language)来定义接口,使得Service能跨进程调用。 - AIDL允许定义方法参数和返回类型,生成客户端和服务端的代理类,实现进程间...

    Android-安卓跨进程跨app通信框架

    在Android系统中,由于安全性和资源隔离的考虑,每个应用程序都运行在自己的进程中,相互之间默认是不能直接访问对方的数据或方法的。然而,在某些情况下,例如组件复用、插件化开发或者服务共享等,我们需要实现跨...

    android跨进程访问.pdf

    **Activity跨进程访问** Activity不仅可以在同一进程中调用,也可以实现跨进程调用。当在同一应用内启动Activity时,只需传入Context对象和Activity的Class对象。跨进程访问则不同,它需要一个特定的Action字符串来...

    跨进程访问Activity实例

    在Android开发中,跨进程访问Activity是一个相对复杂的主题,它涉及到Android系统对进程间通信(Inter-Process Communication, IPC)的支持。通常,Android中的每个应用都运行在一个独立的进程中,这意味着一个应用...

    Android 实现进程及Service常驻之MarsDaemon源码

    本文将深入探讨如何使用MarsDaemon源码实现Android进程及Service的常驻,确保服务即使在用户退出应用或者系统清理内存时也能持续运行。 首先,了解Android的进程生命周期是至关重要的。Android系统为了优化资源管理...

    android跨进程通信

    - 跨进程访问Activity则需指定一个Action字符串,它是目标Activity的标识。例如,拨打电话的Activity可以通过`Intent.ACTION_CALL`启动: ```java Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse...

    AIDL跨进程学习代码

    在Android系统中,应用程序默认是运行在各自的进程中,它们之间无法直接访问对方的数据或方法,如果需要进行数据交互或者调用服务,就需要一种机制来实现跨进程通信(IPC,Inter-Process Communication)。...

    Service跨进程通讯

    Service跨进程通讯是Android开发中的一个重要概念,当一个Service需要在不同的应用程序进程中运行,或者一个应用程序需要与另一个应用程序的Service进行交互时,就需要用到跨进程通讯。Android提供了多种跨进程通讯...

    跨进程访问 aidl 客户端示例

    总结起来,这个"跨进程访问 aidl 客户端示例"展示了如何利用AIDL在Android中实现进程间的通信。通过定义接口、实现接口、启动服务、绑定服务以及调用服务方法,我们可以让不同进程的应用程序协同工作,从而扩展应用...

    Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

    跨进程服务允许其他应用组件(如Activity)通过Binder机制与其绑定,进行数据交换或调用服务的方法。这种方式常用于不同应用间的协作,例如应用A需要调用应用B的功能,这时可以使用跨进程服务。 5. **无障碍服务...

    使用Intent方式跨进程访问

    本篇文章将深入探讨如何使用Intent实现跨进程访问。 首先,我们要明白在Android中,每个应用程序都运行在自己的进程中,而Intent就是连接不同进程的桥梁。跨进程访问通常涉及到以下两种情况: 1. **启动远程服务...

    安卓串口Socket通讯USB驱动jni相关-androidJNI进程守护service.rar

    这个压缩包文件“安卓串口Socket通讯USB驱动jni相关-androidJNI进程守护service.rar”显然涉及到的关键技术点是Android中的串口通信、Socket通信、USB驱动以及JNI(Java Native Interface)和Service的使用。...

    android各组件详解- Service

    ### Android各组件详解——Service深度解析 在深入探讨Service组件之前,我们首先简要回顾一下Android...理解和掌握Service的创建、生命周期管理以及跨进程调用机制,对于开发高质量、高效率的Android应用至关重要。

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

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

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

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

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

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

    跨进程访问 aidl,与 ch08_aidlclient 工程配合使用

    跨进程访问AIDL的优势在于其高效和安全。由于数据传递是通过系统底层的Binder机制,因此性能损失较小。同时,由于进程隔离,服务端的数据安全性和稳定性得到保障,不会因为客户端的异常而受到影响。 总结来说,AIDL...

    Android 的 Remote Service 开发实例RemoteService

    Remote Service能够使得应用程序组件(如Activity)可以跨进程调用服务中的方法,实现数据共享或执行耗时任务,而不阻塞用户界面。本文将深入探讨Remote Service的基本概念、创建过程以及与之相关的API使用。 一、...

    aidl.rar_AIDL_AIDL.rar_android AIDL service_android service_andr

    AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于在不同进程间进行通信,特别是当服务(Service)需要与客户端(如Activity)跨进程交互时。AIDL帮助开发者定义接口,使得...

    android单进程示例程序

    在Android系统中,每个应用程序默认情况下都在自己的进程中运行,每个...总之,"SingleInstanceTest"项目是一个学习Android进程管理和组件通信的好教材,通过实践理解这些概念对于优化应用性能和提升用户体验至关重要。

Global site tag (gtag.js) - Google Analytics