Service的使用(二)之与activity的通讯
2015-08-12 21:12
316 查看
/***
*
* 1.用Intent在Service和Activity之间传递数据:从activity传到Service
* 2.用Binder在Service和Activity之间传递数据:MainActivity拿到返回的Binder后,可以调用里面的方法,进行业务需求,如改变
Service里面变量的值
* 3.自定义一个接口,监听Service的数据变化,要使用Handler来传递数据,可以改变activity里面的东西
*
*/
跑起来的时候:
工程概况:
activity_main.xml:
MainActivity:
MyService:
*
* 1.用Intent在Service和Activity之间传递数据:从activity传到Service
* 2.用Binder在Service和Activity之间传递数据:MainActivity拿到返回的Binder后,可以调用里面的方法,进行业务需求,如改变
Service里面变量的值
* 3.自定义一个接口,监听Service的数据变化,要使用Handler来传递数据,可以改变activity里面的东西
*
*/
跑起来的时候:
工程概况:
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=".MainActivity"> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvCjc"/> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tvOut"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edtData"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnStartService" android:text="启动服务"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnStopService" android:text="停止服务"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnBindService" android:text="绑定服务"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnUbBindService" android:text="解绑服务"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnSynService" android:text="同步数据"/> </LinearLayout>
MainActivity:
package ivo_chuanzhi.connect_service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; /*** * * 1.用Intent在Service和Activity之间传递数据:从activity传到Service * 2.用Binder在Service和Activity之间传递数据:MainActivity拿到返回的Binder后,可以调用里面的方法,进行业务需求,如改变Service里面的值 * 3.自定义一个接口,监听Service的数据变化,要使用Handler来传递数据,可以改变activity里面的东西 * */ public class MainActivity extends ActionBarActivity implements View.OnClickListener{ private Intent intent; private String data = "传递给Service的数据"; EditText edtData; TextView tvOut,tvCjc; Button btnStart,btnStop,btnBind,btnUnBind,btnSyn; private MyService.MyBinder binder = null; private String Cjc = null; /****************************onCreate************************/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //操作的是同一个Service,不管是一个Intent实例启动还是两个Intent实例 intent = new Intent(MainActivity.this, MyService.class); tvCjc = (TextView) findViewById(R.id.tvCjc); tvOut = (TextView) findViewById(R.id.tvOut); btnStart = (Button) findViewById(R.id.btnStartService); btnStop = (Button) findViewById(R.id.btnStopService); btnBind = (Button) findViewById(R.id.btnBindService); btnUnBind = (Button) findViewById(R.id.btnUbBindService); btnSyn = (Button) findViewById(R.id.btnSynService); edtData = (EditText) findViewById(R.id.edtData); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); btnBind.setOnClickListener(this); btnUnBind.setOnClickListener(this); btnSyn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnStartService: //启动服务:1、startServicer 2、绑定服务 data = edtData.getText().toString(); intent.putExtra("data",data); startService(intent); break; case R.id.btnStopService: //停止服务 stopService(intent); break; case R.id.btnBindService: //绑定服务 bindService(intent, conn, Context.BIND_AUTO_CREATE); break; case R.id.btnUbBindService: //解除绑定 unbindService(conn); break; case R.id.btnSynService: //同步数据 if(binder != null){ //通讯,改变MyService的data值 binder.setData(edtData.getText().toString()); } break; } } ServiceConnection conn = new ServiceConnection() { //服务被绑定成功的时候回调 @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("绑定成功"); //连接后会返回MyBinder,连接Service通讯 binder = (MyService.MyBinder) service; Cjc = binder.getCjc(); tvCjc.setText(Cjc); //通过binder,get到MyService,然后调用srtCallback方法,实现Callback接口,然后就可以实现监听监听Service的数据变化 binder.getMyService().setCallback(new MyService.Callback() { @Override public void onDataChange(String data) { //用Handler来传递,不能直接传递 Message msg = new Message(); Bundle b = new Bundle(); b.putString("data", data); msg.setData(b); handler.sendMessage(msg); } }); } //被绑定的服务断线时候会回调 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("绑定失败"); } }; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); tvOut.setText(msg.getData().getString("data")); } }; }
MyService:
package ivo_chuanzhi.connect_service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { private boolean ServicerRunning = false; private String data = "这是默认信息"; public MyService() { } //Service都必须实现的方法 @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. //没绑定的话 //throw new UnsupportedOperationException("Not yet implemented"); //如果实现了绑定了,需要实现onBind接口,返回一个Binder对象,通过Binder可以实现与绑定的activity通讯 // return new MyBinder();//可以重写Binder,方便业务与activity通讯,向activity传各种业务数据,重写或自己写各种方法,满足业务的需要 MyBinder binder = new MyBinder(); return binder; } public class MyBinder extends Binder{ private String cjc = "努力提高自己的技术"; public String getCjc(){ return cjc; } public void setData(String data){ MyService.this.data = data; } public MyService getMyService(){ return MyService.this; } } //在activity里面启动了startService(new Intent(MainActivity.this, MyService.class)); //的方法都会回调这个函数,可重复执行 @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("===onStartCommand==="); data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } //创建服务后第一个回调该函数,只执行一次 @Override public void onCreate() { super.onCreate(); System.out.println("我的服务被创建了"); ServicerRunning = true; new Thread() { @Override public void run() { super.run(); int i = 0; while (ServicerRunning) { i++; String str = i + ":" + data; System.out.println(str); if(callback != null){ callback.onDataChange(str);//在循环中不停的被调用,MainActivity那边会不停地回调 } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } //stopService被执行后会回调 @Override public void onDestroy() { //stopService和UnBind都会关掉服务 System.out.println("我的服务被关掉了"); ServicerRunning = false; } //通知外界的接口 public static interface Callback{ //为实现的方法 void onDataChange(String data); } private Callback callback = null; public void setCallback(Callback callback){ this.callback = callback; } public Callback getCallback(){ return callback; } }
相关文章推荐
- IP寻址和子网运算
- 时间复杂度
- jsoup html
- C++里的组合与聚合关系
- 8-12
- jstree动态生成树
- [CareerCup] 5.3 Next Binary Representation 下一个二进制表达
- mongo VUE 操作
- 记一次线上性能优化
- acmcoder1001:Sum Problem细节问题
- [机器学习]线性回归 被Andrew Ng讲的如此简单易懂
- java注解机制
- hdu1818 It's not a Bug, It's a Feature!(隐式图最短路径Dijkstra)
- 值传递和引用传递
- Fibonacci number’s ratio (the hard version)
- HDOJ-1301-POJ-Jungle Roads
- 8种Nosql数据库系统对比
- HDU 1542 Atlantis(线段树扫描线·面积并)
- ORA-06508: PL/SQL: could not find program unit being called
- 获取联系人以及挑选所需要的号码