Activity与Service的交互一
2016-01-24 17:40
344 查看
服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始。当我们需要在后台进行一些操作时我们就可以用到Service。那么如何对将需要的数据在Activity和Service之间进行交互呢?下面就简单介绍两种常见的方法。
实现效果
2.MyService.java
实现效果:
Service创建
1.创建MySerVice类继承Service并重写相关方法
public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
2.在清单文件中注册
打开AndroidManifest.xml文件,添加如下内容<application> ... <service android:name=".MyService" /> </application
一、使用Binder接口
使用Binder接口需要创建一个类去实现它,自己去添加一个方法用于获取Service对象。Activity中绑定Service时,就可以通过此方法获取到Service对象,得到service了那我们还不是想干哈就干哈啦。下面是实现代码:1.activity_main.xml
在布局文件中添加了两个按钮便于测试<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.servicedemo.MainActivity" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick01" android:text="从Service中获取数据" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick02" android:text="从Activity获取数据" /> </LinearLayout>
2.MainActivity,java
在Activity创建时绑定Service,借助ServiceConnection来监听绑定是否成功,最后销毁时解绑Servicepublic class MainActivity extends Activity { private MyService service; private ServiceConnection conn=new ServiceConnection() { //绑定异常时执行 @Override public void onServiceDisconnected(ComponentName name) { } //绑定完成时执行 @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { MyBinder binder=(MyBinder) iBinder; service=binder.getMyService(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick01(View v){ Log.i("Tag", "activity.show="+service.ServiceData()); } public void onClick02(View v){ service.Show("activity中的数据"); } @Override protected void onStart() { super.onStart(); //绑定Service Intent intent=new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); //解绑Service unbindService(conn); } }
3.MyService.java
创建MyBinder类来传输MyService对象public class MyService extends Service { public MyService() { } //创建一个内部类继承Binder接口,使用MyBinder类来传输MyService对象 public class MyBinder extends Binder{ public MyService getMyService(){ return MyService.this; } } public String ServiceData(){ return "Service中的数据"; } public void Show(String data){ Log.i("Tag","service.show="+ data); } //绑定时执行此方法 @Override public IBinder onBind(Intent intent) { return new MyBinder(); } }
实现效果
二、使用Messenger类
与上一个方法不同的是,Messenger中封装了Binder对象,就不用再创建一个Binder对象。但麻烦的是创建Messenger对象时需要传入一个Handler,用于对接收到的消息处理,并且在activity和service都需要一个Messenger对象来传递消息。具体的实现如下:1.activity_main.xml
和上一个布局页面一样,这里就不重复补充了2.MainActivity.java
public class MainActivity extends Activity { //service的送信人 private Messenger serviceMessenger; //activity的送信人 private Messenger activityMessenger; private ServiceConnection conn=new ServiceConnection() { //绑定异常时执行 @Override public void onServiceDisconnected(ComponentName name) { } //绑定完成时执行 @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { serviceMessenger=new Messenger(iBinder); } }; //用于处理消息 class ActivityHandler extends Handler{ @Override public void handleMessage(Message msg) { Log.i("Tag", "Activity:"+msg.obj); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activityMessenger=new Messenger(new ActivityHandler()); } //发送消息和数据给service并显示 public void onClick01(View v){ Message msg=Message.obtain(); msg.what=1; msg.obj="hello!"; try{serviceMessenger.send(msg);}catch(Exception e){e.printStackTrace();} } //发送消息给service并返回数据显示 public void onClick02(View v){ Message msg=Message.obtain(); msg.what=2; msg.replyTo=activityMessenger; try{serviceMessenger.send(msg);}catch(Exception e){e.printStackTrace();} } @Override protected void onStart() { super.onStart(); //绑定Service Intent intent=new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); //解绑Service unbindService(conn); } }
2.MyService.java
public class MyService extends Service { public MyService() { } class ServiceHandle extends Handler{ @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Log.i("Tag", "MyService:"+msg.obj); break; case 2: //发送回消息给activity Message message=Message.obtain(); message.obj="hello!"; try{msg.replyTo.send(message);}catch (Exception e) { e.printStackTrace(); } break; default: break; } } } //绑定时执行此方法 @Override public IBinder onBind(Intent intent) { return new Messenger(new ServiceHandle()).getBinder(); } }
实现效果:
总结
第一次写博客,也不知道怎么写,就把自己学的东西稍微总结了下写了下来,希望能对大伙有帮助,有什么不对的地方也请各位大牛指点指点。谢谢~相关文章推荐
- mybatis+log4j 打印sql
- JavaEE Tutorials (30) - Duke综合案例研究示例
- float 浮点数的无效值和无限大和无限小
- 树的打印方式
- 【转】Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- hdu 1159(DP+字符串最长公共序列)
- iOS9 中不支持http
- Ceph安装
- HDOJ 2041 超级楼梯
- Hive简介
- JavaEE Tutorials (29) - Duke辅导案例研究示例
- tornado的简单使用
- 数据结构实现之索引优先队列用例(多路归并)
- uva 101 - The Blocks Problem
- JavaEE Tutorials (28) - Duke书店案例研究示例
- 监听短信数据库,获取验证码
- iTerm2 快捷键
- 如风一样,飞翔------Day37
- JavaEE Tutorials (27) - Java EE的并发工具
- 我对递归的认识