- 浏览: 55258 次
- 性别:
- 来自: 武汉
最新评论
-
Stark_Summer:
很好 顶顶
android 面试题经典 -
fff32165:
LZ好牛啊!膜拜ing
activity与service的交互
Activity访问service有两种方式,第一种是通过Ibinder接口实现步骤如下
在Service类中
public class PlayerService extends Service {
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class MyBinder extends Binder {
public PlayerService getService() {
return PlayerService.this;
}
}
}
通过MyBinder内部类得到当前service的实例
在要访问service的activity中
/**
* 在PlayerService类中定义了一个MyBinder类,该类实际上是为了获得PlayerService的对象实例的。
* 在ServiceConnection接口的onServiceConnected方法中的第2个参数是一个IBinder类型的变量,
* 将该参数转换成PlayerService.MyBinder对象,并使用MyBinder类中的getService方法获得PlayerService对象。
* 在获得PlayerService对象后,就可以在Activity中随意操作PlayerService了。
*/
public class PlayerActivity extends Activity{
private PlayerService serviceBinder;
ServiceConnection connection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
serviceBinder = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
serviceBinder = ((PlayerService.MyBinder)service).getService();
}
};
}
然后调用bindService() 建立连接。
这里的代码是跳转并绑定service
Intent i=new Intent();
i.setClass(PlayerActivity.this, PlayerService.class);
i.putExtra("mp3info", mp3Info);
i.putExtra("MSG", AppConstant.PalyerMsg.PRE_MSG);
startService(i);
bindService(i, connection, Context.BIND_AUTO_CREATE);
得到serviceBinder后,就可以通过serviceBinder调用service里面的方法了。
第二种方式是通过aidl,具体实现如下
1.建立aidl文件,如果aidl文件的内容是正确的话,ADT会自动生成一个java接口文件(*.java)
2.建立服务类(Service的子类)
3.实现由aidl文件生成的java接口
4.在AndroidManifest.xml文件中配置aidl服务。要注意的是<action>标签中android:name的属性值就是要引用该服务的ID,也就是Intent类的参数值.
1.Aidl文件内容
package net.blogjava.mobile.aidl;
interface IMyService
{
String getValue();
}
2.编写完后会生成一个同名的java文件,这里是IMyService.java我们不需要管这个java文件
3.编写一个MyService类. MyService是Service的子类,在MyService类中定义了一个内嵌类(MyServiceImpl)该类是IMyService.Stub的子类.
package net.blogjava.mobile.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
// TODO Auto-generated method stub
return "Android/OPhone开发讲义";
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
}
4.在AndroidManifest.xml文件中配置MyService类,因为这里是跨进程访问service所以是用指定action的方式.如果在同一个进程中可以不用过滤的intent-filter,只写一个
<service android:name=".MyService" >这样的就可以了,此处是跨进程所以代码写成这样:
<service android:name=".MyService" >
<intent-filter>
<action android:name="net.blogjava.mobile.aidl.IMyService" />
</intent-filter>
</service>
下面是客户端的代码
1. 将自动生成的IMyService.java文件连同包一起复制到客户端工程项目中
2. 客户端的代码如下(可以参考android 项目示例src目录下ch08_aidlclient和ch08_aidl)
package net.blogjava.mobile;
import net.blogjava.mobile.aidl.IMyService;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try {
textView.setText(myService.getValue());
} catch (Exception e) {
}
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
}
发表评论
-
hydra框架中js与java互调原理
2019-06-10 17:18 0本文档主要阐述hydra框架中js与java是如何实现相互 ... -
自定义gradle插件
2019-09-02 11:25 4021.Gradle插件 Gradle可以认为是一个框 ... -
Rxjava2使用
2019-04-24 17:46 0Rxjava是一个基于观察者模式,通过可观察对象发送数据流 ... -
android NDK cmake
2019-04-19 16:00 0CMake是一个跨平台的安 ... -
504 Unsatisfiable Request 问题解决
2019-04-15 11:09 0问题出现背景及描述:在业务中使用Retrofit2网络工具库进 ... -
adb 命令操作
2019-04-11 16:46 0解决ANR还得需要trace.txt ... -
Android Framework之常用类介绍
2012-05-17 09:10 0WindowManagerService 窗口调度服务 ... -
application私有文件访问
2012-05-16 23:13 0首先内部存储路径为/data/data/youPackageN ... -
BroadcastReceiver的使用
2011-12-15 09:47 836使用广播接收器有两种方法,一种是建立一个BroadcastRe ... -
android:gravity 与 layout_gravity的区别
2011-10-27 16:04 700android:gravity 本view内部信息的排列方式对 ... -
android用于打开各种文件的intent
2011-07-29 23:33 1035android用于打开各种文件的intent 2011-03 ... -
Android源码学习之六——ActivityManager框架解析
2011-07-06 22:46 954ActivityManager在操作系统中有重要的作用,本文利 ... -
Android Application Task Activities的关系
2011-07-05 22:11 833什么是Android Application ... -
Android的PackageManager和ActivityManager的功能简介
2011-07-05 21:56 957Android系统为应用管理功能提供了大量的API。根据功能的 ... -
Android 对话框(Dialog)大全
2011-06-30 20:38 773Android 对话框(Dialog)大全 建立你自己的对 ... -
android 开发环境搭建
2011-06-19 15:15 7221.jdk安装及环境变量配置 以jdk1.4 ... -
[Android]正确地访问网络资源----Proxy的使用
2011-05-27 15:15 2486天朝有很多独特的东西,今天要涉及到的是CMWAP与CMNET。 ... -
指定浏览器访问指定页面(支持UC、Opera、QQ、Dolphin、Skyfire、Steel、Google)
2011-05-27 14:32 1310/*先看一下系统浏览器com.android.browser ... -
android:webView总结
2011-05-27 10:02 1133在Android手机中内置了一款高性能webkit内核浏览器, ... -
android 发送短信
2011-05-25 17:56 777要使用手机短信服务,在AndroidManifest.xml中 ...
相关推荐
- 解绑Service:当不再需要与Service交互时,记得调用`unbindService()`,避免内存泄漏。 2. **通信机制** - 通过 Binder 对象:Activity通过Binder对象可以调用Service中的方法,实现数据传递和功能调用。这种...
下面是一个简单的BroadcastService交互示例: ```java // Service中的部分 public class MyService extends Service { public void sendDataToActivity(String data) { Intent intent = new Intent(...
当一个Service需要与多个Activity进行数据交换或控制交互时,Broadcast(广播)就起到了关键的作用。 **Broadcast(广播):** BroadcastReceiver是Android系统中的一个重要组件,它用于接收系统或应用发送的广播...
Activity可以通过`IBinder`与Service交互,例如传递数据或控制Service的行为。 9. **Kotlin的协程支持** 为了优化Service中的异步操作,Kotlin提供了协程支持。在Service中使用协程可以避免主线程阻塞,提高用户...
Activity通常负责用户界面的展示,与用户进行直接交互,而Service则在后台默默执行任务,不与用户界面直接关联。两者之间的数据交互是构建复杂应用程序不可或缺的部分。 首先,从设计角度来看,Activity类似于Web...
本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...
Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本例中提到的“service在后台下载”场景。这种通信机制对于...
Activity作为用户界面的主要载体,负责与用户进行交互;而Service则用于在后台执行长时间运行的操作,即使用户离开应用也能继续运行。本文将深入探讨如何通过动态注册广播(BroadcastReceiver)来实现Activity和...
在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中的“Service向Activity传值,实现Count累加的效果。定时传值”。这种需求常见于实时更新UI或者进行后台计数等操作。 首先,我们来详细...
这篇文章将详细介绍Service与Activity之间的三种交互方式,并提供相关的源码示例。 首先,我们来看第一种交互方式:通过Intent进行通信。Intent是Android系统中的一个核心类,它用于在组件之间传递消息。当你在...
启动Service只执行一次onStartCommand(),而绑定Service允许客户端通过IBinder接口与Service交互。理解何时使用启动或绑定Service是优化应用的关键,因为启动Service在后台持续运行,可能导致资源浪费,而绑定...
`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如`Service`执行完一些操作后,将结果传递给`Activity`进行展示。...
Service中的`onBind`方法返回实现了AIDL接口的Binder对象,这样其他进程就可以通过这个Binder与Service交互。示例代码如下: ```java public class AidlService extends Service { private IAidlService.Stub ...
4. 测试代码:压缩包中的`TestService`可能包含了对上述步骤的实现,可以运行这个测试服务来验证Activity与Service之间的Binder通信是否正常。确保在AndroidManifest.xml中注册了Service,并给予必要的权限。 总结...
下面我们将详细探讨如何通过AIDL让Activity和Service在不同的应用之间进行交互。 首先,AIDL是一种接口定义语言,它的主要作用是定义一个可以在不同进程间调用的接口。当我们创建一个AIDL文件时,实质上是在定义一...
- Activity的onServiceConnected()回调方法被调用,此时可以开始通过IBinder与Service交互。 4. **Service生命周期管理** 当所有绑定Activity都解绑后(unbindService()),Service可能并不会立即销毁,而是由...
在Activity中与Service交互的过程如下: 1. 启动Service:通常通过`startService(Intent)`方法,Intent携带必要的参数(如歌曲路径等)传递给Service。 2. 绑定Service:使用`bindService(Intent, ...
`startService()`适用于无须客户端交互的长期任务,`bindService()`适用于需要与Service频繁交互的情况。 5. **Service的创建与绑定原理**:Service的创建通常在AndroidManifest.xml中声明,然后通过`startService...
本文主要探讨了四种不同的方式来实现Activity与Service之间的交互,以实现特定的功能,例如更新下载进度。 首先,通过广播交互是一种常见的方法。Service在执行任务时,比如下载,可以创建一个BroadcastReceiver,...