android service与activity交互的方试
1:android通过Handler与activity交互
这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。
我们来看看service里面的代码。
然后我们来看看activity里面我们怎么处理的
- public class SingleService extends Service {
- private static Handler mhandler;//更新给前台的handler
- public static void SetHandler(Handler handler)
- {
- mhandler = handler;
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- if(mhandler!=null)
- {
- Message message = new Message();
- message.obj = "service action";
- mhandler.sendMessage(message);//更新消息
- }
- }
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- return null;
- }
- }
- public class MainActivity extends Activity {
- private Handler handler = new Handler() {
- //处理消息
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //传递handler
- SingleService.SetHandler(handler);
- //启动service
- startService(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();
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- }
- //自己的业务处理方法
- public String qurys(int d) {
- if (d > 0 && 0 < 4) {
- return name[d - 1];
- } else
- return null;
- }
- @Override
- public 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 stub
- return qurys(n);
- }
- }
- }
最后看看我们的activity里面的交互情况
- public class MainActivity extends Activity {
- private IService<String> iService;//定义接口
- private myConnection connection;//连接对象
- private Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- //刷新界面
- Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Intent service = new Intent(MainActivity.this, SingleService.class);
- //实例化连接
- connection = new myConnection();
- //启动service
- bindService(service, connection, BIND_AUTO_CREATE);
- //startService(new Intent(MainActivity.this, SingleService.class));
- }
- /***
- * 通过这个类就与service绑定在了一起
- * @author bobo
- *
- */
- class myConnection implements ServiceConnection {
- @Override
- public 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);
- }
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // TODO Auto-generated method stub
- iService = null;
- }
- }
- }
3:利用broadcast
在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。
service里面的代码
- public class SingleService extends Service {
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- intent.setAction("service.selection.test");//创建过滤条件
- intent.putExtra("key", "service selection");//传递参数
- sendBroadcast(intent);
- }
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- //返回我们自定义的binder对象
- return null;
- }
- }
然后是activity里面的代码
- public class MainActivity extends Activity {
- private Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- //刷新界面
- Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //注册广播事件并创建过滤器
- registerReceiver(new myreceiver(), new IntentFilter("service.selection.test"));
- //启动service
- startService(new Intent(MainActivity.this, SingleService.class));
- }
- class myreceiver extends BroadcastReceiver {
- @Override
- public 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
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- getActivityByName("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;
- }
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- return null;
- }
- }
然后是activity里面
- public class MainActivity extends Activity implements UIFresh{
- private Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- //刷新界面
- Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //把activity加入管理列表
- SingleService.allactivity.add(this);
- //启动service
- startService(new Intent(MainActivity.this, SingleService.class));
- }
- /****
- * 实现接口
- */
- @Override
- public void refresh(Object... objects) {
- Message message = new Message();
- message.obj = objects[0];
- handler.sendMessage(message);
- }
- }
这样就可以很好的根据自己的需要与service交互了