Service的使用(二)之与activity的通讯
来源:互联网 发布:多益网络 上市 编辑:程序博客网 时间:2024/05/17 05:16
/***
*
* 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; }}
0 0
- Service的使用(二)之与activity的通讯
- Service与Activity之间的通讯(二)
- Activity与Service之间的通讯机制
- android的一些总结——service(二)之activity与service之间的通信
- android中服务的使用 与 Activity和Service的通讯
- Android中Activity与Service的双向通讯
- Android Service 与Activity之间的通讯方式
- Android Activity与Service的AIDL接口通讯
- Activity与Service的交互二
- Android Activity与Service间的通讯之一(回调函数)
- android service和activity的通讯
- android service的使用(三)- 与activity的交互
- Fragment与Activity的通讯
- Fragment与Activity的通讯
- Android--activity配置与activity之间的通讯(一)
- 初识 Service(二) 演示: Activity 调用Service的接口
- 初识 Service(二) 演示: Activity 调用Service的接口
- Android中服务(Service)的的生命周期,两种开启服务的方式的不同点,Service与Activity之间的通讯
- 8-12
- 【工业串口和网络软件通讯平台(SuperIO)教程】五.二次开发图形显示界面
- C++里的组合与聚合关系
- 【Linux】yum安装lamp环境
- POJ 1903 Jurassic Remains -- 中途相遇法
- Service的使用(二)之与activity的通讯
- 黑马程序员------OC中类的声明和实现
- HDOJ 2122 Ice_cream’s world III(最小生成树prim算法)
- 开博语
- UITabelBar
- CS/BS模式
- hdu 5372 Segment Game (树状数组+离散化)
- jquery autocomplete文本自动补全
- (一二〇)CALayer的一些特性