- 浏览: 591152 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (154)
- java (31)
- Struts (3)
- Hibernate (8)
- Spring (6)
- JS (14)
- DWR (1)
- Oracle (1)
- SQL Server (0)
- JSF (0)
- JPA (0)
- Grails (3)
- Ajax (1)
- Extjs (0)
- jQuery (4)
- MySQL (2)
- 正则表达式 (2)
- 其他 (6)
- 计算机应用 (7)
- Groovy (8)
- Google (1)
- Web (2)
- MongoDB Java Driver (1)
- mongodb (1)
- Linux (3)
- HTML (1)
- Tomcat (3)
- Eclipse (2)
- JSP (1)
- 缓存 (1)
- 动态 (1)
- 问题与解决 (3)
- HY (1)
- Android (35)
- LBS (1)
最新评论
-
u012136165:
list 方法:纠正:[2,5].add(1,9) ...
Groovy的list和map -
bruce.yuan:
误人子弟的文章。已经看到N个人转了这个帖子,这要贻害多少新人啊 ...
理解并解决GBK转UTF-8奇数中文乱码 -
思念-悲伤:
特意登录上来,感谢下!
理解String的compareTo()方法返回值 -
bo_hai:
总结的好,有效。
理解String的compareTo()方法返回值 -
u012678420:
在onCreate方法中获取某个View的宽度和高度
Service使用方式
- 博客分类:
- Android
使用Service的场合:
1.一个或多个Activity需要向同一应用中的Service发出执行某一操作的命令。
PS:不需要绑定
2.某个Activity需要同一应用中的Service为其单独服务,当此Activity消毁时,也将为其服务的Service一并消毁。
PS:需要绑定
3.多个Activity绑定到同一个Service,仅当所有Activity取消了绑定,Service才消毁。
PS:只有第一个Activity绑定时才调用onBind()方法,第二个、第三个....第N个直接取得第一个Activity绑定时onBind()方法返回的IBinder对象
4.即使退出当前应用时,仍希望Service继续运行(如:上传或下载任务);或者此Service为其他应用提供服务。
PS:需要跨进程通信(IPC)
4.1当远程服务不需要支持多线程时,使用Messager.
Server端应用代码
public class RemoteServiceProxy extends Service { public static final int GET_RESULT = 1; private final Messenger mMessenger = new Messenger(new Handler() { private int status = 0; @Override public void handleMessage(Message msg) { if (msg.what == GET_RESULT) { try { msg.replyTo.send(Message.obtain(null, GET_RESULT, status++, 0)); } catch (RemoteException e) { e.printStackTrace(); } } else { super.handleMessage(msg); } } }); @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } }
<service android:name=".module.photo.RemoteServiceProxy" android:process=":remote" />
Client端应用代码
//开启一个服务 bindService(new Intent(this, RemoteServiceProxy.class), mConnection, BIND_AUTO_CREATE); private Messenger mService; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); } @Override public void onServiceDisconnected(ComponentName name) { } };
private Messenger mMessenger = new Messenger(new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == RemoteServiceProxy.GET_RESULT) { Log.i("M", "From Remote Service "+msg.arg1); } else { super.handleMessage(msg); } } }); Message message = Message.obtain(null, RemoteServiceProxy.GET_RESULT); message.replyTo = mMessenger; try { mService.send(message); } catch (RemoteException e) { e.printStackTrace(); }
4.2当远程服务需要同时响应多个Client的请求,使用AIDL.
注意:一般我们应用中是不需要使用AIDL的,这里仅仅是为了学习和深入理解Android的IPC机制。
Server端应用代码
在Server端应用新建IRemoteService.aidl和IRemoteCallback.aidl文件,编辑内容如下
package com.example.aidl; interface IRemoteCallback { void executeCallback(String msg); }
package com.example.aidl; import com.example.aidl.IRemoteCallback; interface IRemoteService { //注册回调 void register(IRemoteCallback callback); //取消注册回调 void unregister(IRemoteCallback callback); //执行回调 void execute(); //获取状态 int getStatus(String flag); }
创建Service类为客户端提供服务
package com.example.server.service; import com.example.aidl.IRemoteCallback; import com.example.aidl.IRemoteService; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; public class RemoteService extends Service { @Override public IBinder onBind(Intent intent) { return iBinder; } private final RemoteCallbackList<IRemoteCallback> remoteCallbackList = new RemoteCallbackList<IRemoteCallback>(); private IRemoteService.Stub iBinder = new IRemoteService.Stub() { @Override public void register(IRemoteCallback cb) throws RemoteException { if (cb != null) remoteCallbackList.register(cb); } @Override public void unregister(IRemoteCallback cb) throws RemoteException { if (cb != null) remoteCallbackList.unregister(cb); } @Override public void execute() throws RemoteException { int size = remoteCallbackList.beginBroadcast(); while (size > 0) { size--; remoteCallbackList.getBroadcastItem(size).executeCallback("Hello, Client."); } remoteCallbackList.finishBroadcast(); Log.i("RS", "RemoteService.execute() has done."); } int status; @Override public int getStatus(String flag) throws RemoteException { Log.i("RS", "RemoteService.getStatus(flag) flag is "+flag); if ("reset".equals(flag)) status = 0; return status++; } }; }
在AndroidManifast.xml中配置Service,必需设置Action过滤
<service android:name=".server.service.RemoteService" android:process=":remote"> <intent-filter> <action android:name="test.remote.service"/> </intent-filter> </service>
Client端应用代码
将Server端创建的IRemoteService.aidl和IRemoteCallback.aidl文件copy到Client端应用中
在Client端获取Server端的RemoteService对象的引用
package com.example; import com.example.aidl.IRemoteCallback; import com.example.aidl.IRemoteService; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; public class ClientActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.client_activity); /* 绑定远程服务,与其他进程Service通信。 注意:Client需要通过Action与RemoteService绑定,因为Client端是没有RemoteService.class的 */ this.bindService(new Intent("test.remote.service"), sConnection, BIND_AUTO_CREATE); this.findViewById(R.id.execute_callback).setOnClickListener(mOnClickListener); this.findViewById(R.id.get_status).setOnClickListener(mOnClickListener); } private OnClickListener mOnClickListener = new OnClickListener() { @Override public void onClick(View button) { try { if (button.getId() == R.id.execute_callback) remoteService.execute(); else { int remoteStatus = remoteService.getStatus("set"); Toast.makeText(getApplicationContext(), "Status: "+remoteStatus+" is from RemoteService", Toast.LENGTH_LONG).show(); } } catch (RemoteException e) { e.printStackTrace(); } } }; private IRemoteService remoteService;//远程服务 private ServiceConnection sConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { remoteService = IRemoteService.Stub.asInterface(service); //注册回调 try { remoteService.register(remoteCallback); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { //意外断开连接时回调 remoteService = null; } }; private IRemoteCallback.Stub remoteCallback = new IRemoteCallback.Stub() { @Override public void executeCallback(String msg) throws RemoteException { Toast.makeText(getApplicationContext(), "ClientActivity: "+msg, Toast.LENGTH_LONG).show(); } }; }
评论
发表评论
-
深入分析AIDL原理
2011-11-13 16:14 25357在上一篇文章(Service使用方式)中,介绍了Android ... -
在onCreate方法中获取某个View的宽度和高度
2011-10-08 14:54 14414有时候需要在onCreate方法中知道某个View组件的宽度和 ... -
不加载图片,仅仅获取图片文件分辨率
2011-10-08 11:09 3925当从SD卡中获取图片时,如果图片太大,加载会出现溢出异常。因此 ... -
图片移动和缩放
2011-09-29 22:15 2101import android.graphics.Matr ... -
定时任务
2011-09-28 00:53 1482定时任务有执行一次和重复执行两种 public cla ... -
几种创建LayoutInflater对象的方法
2011-09-28 00:51 1836LayoutInflater layoutInflate ... -
判断网络类型及是否有网络
2011-09-28 00:49 2738判断当前是否有可用网络 public boolean ... -
设置全屏
2011-09-26 23:40 18861.编程方式 public void setFullS ... -
dip与px单位之间转换
2011-09-25 10:11 1611//转换dip为px public static in ... -
屏幕尺寸(高、宽)
2011-09-25 10:11 1862Display display = getWindowM ... -
判断手机外存(SD卡)状态
2011-09-25 10:07 2134public int getExternalStorag ... -
SQLite数据类型
2011-09-25 10:03 9316一般数据采用的固 ... -
使用WebView实现腾讯微博OAuth登录
2011-09-24 21:11 4847接着上一篇文章"使用WebView实现新浪微博OAu ... -
使用WebView实现新浪微博OAuth登录
2011-09-20 12:18 8461#新浪官方下载SDK(weibo4android) h ... -
高效率下载图片——防止内存溢出
2011-09-18 13:09 2176在应用中经常需要下载很多的图片,因此,写好图片下载部分的代码非 ... -
PopupWindow使用
2011-09-16 14:05 1759使用PopupWindow来显示一个浮层 点击按钮后弹出 ... -
Android通知
2011-09-07 17:56 1884private void showNotification() ... -
AlarmManager.RTC和ELAPSED_REALTIME的区别
2011-09-04 17:33 30031AlarmManager.RTC,硬件闹钟,不唤醒手机( ... -
开机自启动
2011-09-04 13:55 1617经常会有这样的需求,当手机开机后立刻启动一个服务或者一个活动。 ... -
Android虚拟机(DVM)内存分配——内存溢出问题
2011-09-03 17:19 9863大家都知道Android的上层应用是基于 Dalvik ...
相关推荐
演示了Service的各种使用方式,应可供初学者学习。
AccessibilityService的使用方式介绍及使用细节,适合初学者。
Android Service使用,包括Start Service和bind Service启动方式。Service与Acvitity互相传递数据
C#中通过直接添加引用的方来调用Web Service的方式不够灵活,故采取手动发送Http请求的方式来调用Web Service。最后选择使用Post方式来调用Web Service
1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的); 2.具有较长时间的运行特性。 1.Service AndroidManifest.xml 声明 一般而言,从Service的启动...
使用基础的网络请求方式,使用Service下载网络apk文件,然后进行安装的小DEMO
service介绍,包含PPT和源码,介绍了service的onstart方式和onbind方式的启动演示。不可错过的好资料:)
通过Context.startService()方式去使用服务的示例
为了使UNIX/Linux机器可以通过NFS 协议使用NAS(Network Attached Storage 网络存储服务器)的硬盘资源,NAS 需要设置Service for Unix。文详尽的描述了在下述两种场景下:工作组(WorkGroup)方式、Windows 域方式...
Android创建Service后台常驻服务并使用Broadcast通信,即基于Broadcast通信方式实现了一种Service Thread与Activity异步工作的方法。
要在Smart Device项目中使用XML Web ...要生成同步XML Web Service调用,需要创建一个代理类实例,然后调用此代理类中的方法,方式与调用其他类中的方法相同。文中演示了如何生成对XML Web Service 的Web方法的调用。
可以很方便的为你的服务端程序,集成WindowsService服务方式的功能 ============================================ ods集成说明 使用前提 [1]ods必须在Win32编译模式下编译 [2]编译模式设置为Unicode方式 ========...
该代码描述了Service的生命周期以及播放音乐的使用.两种启动service的方式都有记录。
startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯startService的使用,不涉及任何bindService方法调用的情况。如果想了解bindService的相关...
详细的介绍Service的使用方式,并用两种方式来启动Service,因为Service是一个服务进程,所以在示例中,我在启动Service和消亡时分别发出notification通知。这个示例包括一张显示的Activity还有一个Service类,其中...
如果使用这种方式,Service中需要定义一个Handler对象(负责对客户端发送过来的Message进行响应)。 Messenger可以共享给client一个IBinder对象,client通过这个IBinder对象向Service发送Message,而前面提到的Handler...
1. 使用了BindService绑定Service。 2. 使用Boardcast,Service发送广播通知Activity更新进度条进度,歌曲状态更新等。
Android中bindService调用服务的核心代码,有问题欢迎提出,共同进步。