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;
}
};
}
分享到:
相关推荐
- 对于需要返回复杂Java对象的情况,可以使用AIDL(Android Interface Definition Language)来定义接口,使得Service能跨进程调用。 - AIDL允许定义方法参数和返回类型,生成客户端和服务端的代理类,实现进程间...
在Android系统中,由于安全性和资源隔离的考虑,每个应用程序都运行在自己的进程中,相互之间默认是不能直接访问对方的数据或方法的。然而,在某些情况下,例如组件复用、插件化开发或者服务共享等,我们需要实现跨...
**Activity跨进程访问** Activity不仅可以在同一进程中调用,也可以实现跨进程调用。当在同一应用内启动Activity时,只需传入Context对象和Activity的Class对象。跨进程访问则不同,它需要一个特定的Action字符串来...
在Android开发中,跨进程访问Activity是一个相对复杂的主题,它涉及到Android系统对进程间通信(Inter-Process Communication, IPC)的支持。通常,Android中的每个应用都运行在一个独立的进程中,这意味着一个应用...
本文将深入探讨如何使用MarsDaemon源码实现Android进程及Service的常驻,确保服务即使在用户退出应用或者系统清理内存时也能持续运行。 首先,了解Android的进程生命周期是至关重要的。Android系统为了优化资源管理...
- 跨进程访问Activity则需指定一个Action字符串,它是目标Activity的标识。例如,拨打电话的Activity可以通过`Intent.ACTION_CALL`启动: ```java Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse...
在Android系统中,应用程序默认是运行在各自的进程中,它们之间无法直接访问对方的数据或方法,如果需要进行数据交互或者调用服务,就需要一种机制来实现跨进程通信(IPC,Inter-Process Communication)。...
Service跨进程通讯是Android开发中的一个重要概念,当一个Service需要在不同的应用程序进程中运行,或者一个应用程序需要与另一个应用程序的Service进行交互时,就需要用到跨进程通讯。Android提供了多种跨进程通讯...
总结起来,这个"跨进程访问 aidl 客户端示例"展示了如何利用AIDL在Android中实现进程间的通信。通过定义接口、实现接口、启动服务、绑定服务以及调用服务方法,我们可以让不同进程的应用程序协同工作,从而扩展应用...
跨进程服务允许其他应用组件(如Activity)通过Binder机制与其绑定,进行数据交换或调用服务的方法。这种方式常用于不同应用间的协作,例如应用A需要调用应用B的功能,这时可以使用跨进程服务。 5. **无障碍服务...
本篇文章将深入探讨如何使用Intent实现跨进程访问。 首先,我们要明白在Android中,每个应用程序都运行在自己的进程中,而Intent就是连接不同进程的桥梁。跨进程访问通常涉及到以下两种情况: 1. **启动远程服务...
这个压缩包文件“安卓串口Socket通讯USB驱动jni相关-androidJNI进程守护service.rar”显然涉及到的关键技术点是Android中的串口通信、Socket通信、USB驱动以及JNI(Java Native Interface)和Service的使用。...
### Android各组件详解——Service深度解析 在深入探讨Service组件之前,我们首先简要回顾一下Android...理解和掌握Service的创建、生命周期管理以及跨进程调用机制,对于开发高质量、高效率的Android应用至关重要。
Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...
Service的跨进程通信实战 设想这么一个场景,我们有2个APP(或者2个进程,均可),其中一个APP需要提供一个Person相关的服务(该服务有一个名为eat的接口),我们叫它PersonServer;另一个APP需要访问PersonServer...
AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。 实现步骤 例:用 A程序去访问 B程序的MyService.java服务 在B中...
跨进程访问AIDL的优势在于其高效和安全。由于数据传递是通过系统底层的Binder机制,因此性能损失较小。同时,由于进程隔离,服务端的数据安全性和稳定性得到保障,不会因为客户端的异常而受到影响。 总结来说,AIDL...
Remote Service能够使得应用程序组件(如Activity)可以跨进程调用服务中的方法,实现数据共享或执行耗时任务,而不阻塞用户界面。本文将深入探讨Remote Service的基本概念、创建过程以及与之相关的API使用。 一、...
AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于在不同进程间进行通信,特别是当服务(Service)需要与客户端(如Activity)跨进程交互时。AIDL帮助开发者定义接口,使得...
在Android系统中,每个应用程序默认情况下都在自己的进程中运行,每个...总之,"SingleInstanceTest"项目是一个学习Android进程管理和组件通信的好教材,通过实践理解这些概念对于优化应用性能和提升用户体验至关重要。