您的位置:首页 > 移动开发 > Android开发

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交互了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: