andorid service activity交互方式
来源:互联网 发布:广州天际网络 编辑:程序博客网 时间:2024/05/18 01:26
android service与activity交互的方试
1:android通过Handler与activity交互
这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。
我们来看看service里面的代码。
public class SingleService extends Service {private static Handler mhandler;//更新给前台的handlerpublic static void SetHandler(Handler handler){mhandler = handler;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();if(mhandler!=null){Message message = new Message();message.obj = "service action";mhandler.sendMessage(message);//更新消息}}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}}然后我们来看看activity里面我们怎么处理的
public class MainActivity extends Activity {private Handler handler = new Handler() {//处理消息@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//传递handlerSingleService.SetHandler(handler);//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}}
2:利用bindservice
都知道service有两种启动方式,一种是startservice这种方式是不管你调用startservice再多次都service的oncreate方法都只执行一次,但是onstart方法会照样执行,它的生命周期也更启动它的activity没有关系,当activity销毁的时候service不会销毁,第二种方式是bindservice这种时候不管你怎么启动它也是只执行一次,但是他的生命周期却是和宿主activity绑定在一起的我们在activity中通过调用bindService来获取连接引用然后可以通过这个引用实现对service里面的数据操作。
这里我们定义一个接口
/** * 用户接口 * @author bobo * * @param <T> */public interface IService <T>{//用户接口public T qury(int n);}
然后写我们的service
public class SingleService extends Service {private String name[] = { "小红", "小名", "张三", "李四" };IBinder binder = new MyBinder();@Overridepublic void onCreate() {// TODO Auto-generated method stub}//自己的业务处理方法public String qurys(int d) {if (d > 0 && 0 < 4) {return name[d - 1];} elsereturn null;}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stub//返回我们自定义的binder对象return binder;}/*** * 绑定类 * @author bobo * */public class MyBinder extends Binder implements IService<String> {@Override//实现接口public String qury(int n) {// TODO Auto-generated method stubreturn qurys(n);}}}
最后看看我们的activity里面的交互情况
public class MainActivity extends Activity {private IService<String> iService;//定义接口private myConnection connection;//连接对象private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent service = new Intent(MainActivity.this, SingleService.class);//实例化连接connection = new myConnection();//启动servicebindService(service, connection, BIND_AUTO_CREATE);//startService(new Intent(MainActivity.this, SingleService.class));}/*** * 通过这个类就与service绑定在了一起 * @author bobo * */class myConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//获取到连接接口iService = (IService<String>) service;Message msg = new Message();//调用service里面的方法msg.obj = iService.qury(3);handler.sendMessage(msg);}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubiService = null;}}}
3:利用broadcast
在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。
service里面的代码
public class SingleService extends Service {@Overridepublic void onCreate() {// TODO Auto-generated method stubIntent intent = new Intent();intent.setAction("service.selection.test");//创建过滤条件intent.putExtra("key", "service selection");//传递参数sendBroadcast(intent);}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stub//返回我们自定义的binder对象return null;}}
然后是activity里面的代码
public class MainActivity extends Activity {private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册广播事件并创建过滤器registerReceiver(new myreceiver(), new IntentFilter("service.selection.test"));//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}class myreceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//获取传递过来的值String key = intent.getStringExtra("key");Message message = new Message();message.obj = key;handler.sendMessage(message);}}}
4:自定义交互方式
前面都说道了,基本上这些交互方式就够一般的需求了,但是我就在想有没有一种方法可以更好的让一个service给多个activity服务,这样就不用每次都要在activity里面注册广播事件,这里就就写写我自己是怎么实现的方法。
public class SingleService extends Service {public static List<UIFresh> allactivity = new ArrayList<UIFresh>();//创建一个容器来存取activity@Overridepublic void onCreate() {// TODO Auto-generated method stubgetActivityByName("MainActivity").refresh("Service action");}/**** * 根据名字获取activity * @param name * @return */private UIFresh getActivityByName(String name) {UIFresh ia = null;for (UIFresh ac : allactivity) {if (ac.getClass().getName().indexOf(name) >= 0) {ia = ac;}}return ia;}@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}}
然后是activity里面
public class MainActivity extends Activity implements UIFresh{private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//刷新界面Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//把activity加入管理列表SingleService.allactivity.add(this);//启动servicestartService(new Intent(MainActivity.this, SingleService.class));}/**** * 实现接口 */@Overridepublic void refresh(Object... objects) {Message message = new Message();message.obj = objects[0];handler.sendMessage(message);}}
这样就可以很好的根据自己的需要与service交互了
- andorid service activity交互方式
- Service Activity三种交互方式
- android Service Activity三种交互方式
- android Service Activity三种交互方式
- android service与Activity的交互方式
- Service Activity三种交互方式
- Activity和Service的交互方式
- android Service Activity三种交互方式(付源码)
- Android中Activity与Service的交互方式
- Android Service Activity三种交互方式(附源码)
- Activity与Service交互
- Activity和Service交互
- andorid 一个与activity有数据交互的本地服务(了解service就看这一篇就可以)
- activity和service的交互
- activity和service的交互
- Activity和Service的交互
- service与activity交互实践
- Android Service与Activity交互
- 2013级C++第12周项目——函数应用
- CentOS下安装word2vec的linux教程
- 去百度定向广告
- JDBC URL的概念
- java中String的用法(二)
- andorid service activity交互方式
- 布局管理器-RelativeLayout补充
- Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
- mysql分组查询最大的数据
- 判断session可以有多种方法
- LoadRunner性能测试参数化
- HttpClient 教程 (一)
- Oscache与memcached区别
- cookie 和session 的区别详解