服务间的通讯
2016-01-09 14:24
211 查看
概念之类的不做多的介绍,直接百度就行了大把的有,这里主要介绍服务开启、服务绑定、数据同步、数据通讯的代码实现
首先在开启服务之前必须的先创建服务代码后面给出,开启服务之后要在AndroidManifest.xml文件中声明。声明代码如下
在将数据从Service服务传递到Activity时用的是回调的方法,同时因为Android的机制是其他线程不能处理界面线程,所以在Activity界面也需要用Handler实现不同进程的通讯。
完整的项目代码地址点击打开链接
首先在开启服务之前必须的先创建服务代码后面给出,开启服务之后要在AndroidManifest.xml文件中声明。声明代码如下
//服务声明 <service android:name=".MyService" android:enabled="true" android:exported="true" > </service>开启服务和开启Activity用法一样都是通过Intent开启
//服务开启 Intent intent = new Intent(MainActivity.this, MyService.class); intent.putExtra("data", etServiceData.getText().toString());//传递数据 startService(intent); //停止服务 stopService(intent); //绑定服务 bindService(intent, this, Context.BIND_AUTO_CREATE); //解除绑定 unbindService(this);在绑定服务和解除绑定服务的时候,所在的类要实现ServiceConnection接口。之后就是数据同步这里直接上完整的代码如下
<!--activity_main.xml--> <?xml version="1.0" encoding="utf-8"?> <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/tvCallbackData" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/etServiceData" android:text="default message、、、、、" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btnStartService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开服务" /> <Button android:id="@+id/btnStopService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止服务" /> <Button android:id="@+id/btnBindService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绑定服务" /> <Button android:id="@+id/btnUnbindService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="解除绑定" /> <Button android:id="@+id/btnSyscData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="同步数据" /> </LinearLayout>
//MyService.java public class MyService extends Service { private boolean running = false; private String data = ""; public MyService() { } @Override public IBinder onBind(Intent intent) { return new Binder(); } public class Binder extends android.os.Binder { public void setData(String _data) { MyService.this.data = _data; } public MyService getService(){ return MyService.this; } } @Override public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); running = true; new Thread() { public void run() { super.run(); int i=0; while (running) { i++; String str=i+"---service is runing---data:" + data; System.out.println(str); if (callback!=null){ callback.onDataChange(str); } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } @Override public void onDestroy() { super.onDestroy(); running = false; } private Callback callback=null; public void setCallback(Callback callback) { this.callback = callback; } public Callback getCallback() { return callback; } public static interface Callback{ void onDataChange(String data); } }
//MainActivity.java public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection { private Button btnStartService; private Button btnStopService; private Button btnBindService; private Button btnUnbindService; private Button btnSyscData; private EditText etServiceData; private TextView tvCallbackData; private Intent intent; private MyService.Binder binder = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartService = (Button) findViewById(R.id.btnStartService); btnStopService = (Button) findViewById(R.id.btnStopService); btnBindService = (Button) findViewById(R.id.btnBindService); btnUnbindService = (Button) findViewById(R.id.btnUnbindService); btnSyscData = (Button) findViewById(R.id.btnSyscData); etServiceData = (EditText) findViewById(R.id.etServiceData); tvCallbackData = (TextView) findViewById(R.id.tvCallbackData); btnStartService.setOnClickListener(this); btnStopService.setOnClickListener(this); btnBindService.setOnClickListener(this); btnUnbindService.setOnClickListener(this); btnSyscData.setOnClickListener(this); intent = new Intent(MainActivity.this, MyService.class); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnStartService: intent.putExtra("data", etServiceData.getText().toString()); startService(intent); break; case R.id.btnStopService: stopService(intent); break; case R.id.btnBindService: intent.putExtra("data", etServiceData.getText().toString()); bindService(intent, this, Context.BIND_AUTO_CREATE); break; case R.id.btnUnbindService: unbindService(this); break; case R.id.btnSyscData: if (binder != null) { Toast.makeText(MainActivity.this, "jamie", Toast.LENGTH_SHORT).show(); binder.setData(etServiceData.getText().toString()); } else { Toast.makeText(MainActivity.this, "jamie---------------1", Toast.LENGTH_SHORT).show(); } break; } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); tvCallbackData.setText(msg.getData().toString()); } }; @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (MyService.Binder) service; binder.getService().setCallback(new MyService.Callback() { @Override public void onDataChange(String _data) { Message message = new Message(); Bundle bundle = new Bundle(); bundle.putString("backData", _data); message.setData(bundle); handler.sendMessage(message); } }); } @Override public void onServiceDisconnected(ComponentName name) { } }
在将数据从Service服务传递到Activity时用的是回调的方法,同时因为Android的机制是其他线程不能处理界面线程,所以在Activity界面也需要用Handler实现不同进程的通讯。
完整的项目代码地址点击打开链接
相关文章推荐
- 显示图像数据的高级接口 UIImage
- RHEL/Centos7下使用EPEL和REMI源
- WebService学习总结(一)——WebService的相关概念
- 教你编译PHP7 (nginx+mysql+php7)
- Eclipse下使用Tomcat插件打包war文件的详细过程
- SQL 替换指定列中的指定字符串
- 利用js制作异步验证ajax方法()
- 软工课程总结
- HTML——图片自动轮换和手动轮换
- 【iOS】判断NSString字符串为空
- Servlet&JSP学习笔记--导航
- 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
- Android开发应用下载全集
- using简单实用
- 反射获取对象属性
- 基于位置服务,手机定位
- LCD驱动调试常见问题和一些解决方式
- Ruby元编程-Week-4
- 无形装逼,最为致命——玩LOL那些有趣的台词
- 三年工作总结