- 浏览: 53194 次
- 性别:
- 来自: 武汉
最新评论
-
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 3491.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 780使用广播接收器有两种方法,一种是建立一个BroadcastRe ... -
android:gravity 与 layout_gravity的区别
2011-10-27 16:04 655android:gravity 本view内部信息的排列方式对 ... -
android用于打开各种文件的intent
2011-07-29 23:33 977android用于打开各种文件的intent 2011-03 ... -
Android源码学习之六——ActivityManager框架解析
2011-07-06 22:46 904ActivityManager在操作系统中有重要的作用,本文利 ... -
Android Application Task Activities的关系
2011-07-05 22:11 774什么是Android Application ... -
Android的PackageManager和ActivityManager的功能简介
2011-07-05 21:56 939Android系统为应用管理功能提供了大量的API。根据功能的 ... -
Android 对话框(Dialog)大全
2011-06-30 20:38 713Android 对话框(Dialog)大全 建立你自己的对 ... -
android 开发环境搭建
2011-06-19 15:15 6991.jdk安装及环境变量配置 以jdk1.4 ... -
[Android]正确地访问网络资源----Proxy的使用
2011-05-27 15:15 2453天朝有很多独特的东西,今天要涉及到的是CMWAP与CMNET。 ... -
指定浏览器访问指定页面(支持UC、Opera、QQ、Dolphin、Skyfire、Steel、Google)
2011-05-27 14:32 1278/*先看一下系统浏览器com.android.browser ... -
android:webView总结
2011-05-27 10:02 1082在Android手机中内置了一款高性能webkit内核浏览器, ... -
android 发送短信
2011-05-25 17:56 742要使用手机短信服务,在AndroidManifest.xml中 ...
相关推荐
一个很完整的activity和service的相互交互例子
这个是我在网上看到一篇文章,作者给出了activity和service交互的代码,但是还是很多人找作者要,我觉得有代码很好,写写增加记忆,这里有吧我写的拿出来与大家分享下!!
主要介绍了Android Activity 与Service进行数据交互的相关资料,在开发Android App的时候经常会使用这样的功能,需要的朋友可以参考下
通过动态注册广播,实现activity和service的交互。activityUI的文本可以显示service里的值
启动后台service后,service内跑一个线程,5秒后发送一个广播给系统,Activity接收到该广播后显示service发送的信息。本例主要是实现后台service与前activity的交互
Service与多个Activity通过Broadcast进行交互
通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。...
Service向Activity传值,实现Count累加的效果。定时传值
以下是对Activity与Service之间交互并播放歌曲的实现代码进行了详细的分析介绍,需要的朋友可以过来参考下
不同的两个应用A和B,A中有Service,B中通过aidl和A实现交互
service在后台下载,与前台多个activity通信,结果发现有一个坑,找到原因后,跟大家一起分享。
简单的实现service和activity共享数据
NULL 博文链接:https://yangguangfu.iteye.com/blog/699306
先把效果图下载下来,然后将图片后缀改为.zip,再解压即可得到源代码
下面小编就为大家带来一篇Service Activity的三种交互方式(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
安卓开发观察者模式应用-一个service通知多个activity更新ui的实现, service与activity的交互: 1.接口回调 2.自定义广播 3.观察者模式
请参照 初识 Service(三) 演示:Service给 Activity传递消息 http://blog.csdn.net/gdp2852/article/details/6968065