android service与activity交互的方试
2015-02-04 19:58
323 查看
android service与activity交互的方试
1:android通过Handler与activity交互
这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。我们来看看service里面的代码。
[java]
view plaincopyprint?
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里面我们怎么处理的
[java]
view plaincopyprint?
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里面的数据操作。这里我们定义一个接口
[java]
view plaincopyprint?
/**
* 用户接口
* @author bobo
*
* @param <T>
*/
public interface IService <T>{
//用户接口
public T qury(int n);
}
然后写我们的service
[java]
view plaincopyprint?
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里面的交互情况
[java]
view plaincopyprint?
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里面的代码
[java]
view plaincopyprint?
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里面的代码
[java]
view plaincopyprint?
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里面注册广播事件,这里就就写写我自己是怎么实现的方法。[java]
view plaincopyprint?
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里面
[java]
view plaincopyprint?
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交互了
相关文章推荐
- android Service之一:不需和Activity交互的本地服务
- android Service Activity三种交互方式
- android开发之使用Messenger实现service与activity交互
- Android情景案例——Activity与Service通讯交互
- Android Activity与Service的交互方式
- android Service之一:不需和Activity交互的本地服务
- 关于Android中Service与Activity的信息交互
- android开发之使用Messenger实现service与activity交互
- android开发之使用Messenger实现service与activity交互
- Android中Activity和Service简单交互(通过广播机制)
- android Service之二:和Activity交互的本地服务
- android service与Activity的交互方式
- 关于Android中Service与Activity的信息交互
- Android四大组件应用系列——Activity与Service交互实现APK下载
- Android中Activity和Service简单交互的例子
- Android Service 与 Activity的交互方式
- Android中Activity与Service的交互方式
- 在Android中实现Service动态更新UI界面(Service与主程序Activity之间的数据交互或控制)
- Android中Service与Activity数据交互的简单理解
- Android Activity与Service数据交互:Binder、bindService(系列2)