andorid service activity交互方式

42 篇文章 0 订阅

android service与activity交互的方试

1:android通过Handler与activity交互

这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。
我们来看看service里面的代码。
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;
	}

}
然后我们来看看activity里面我们怎么处理的
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交互了
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值