前言:

我们都知道Android的四大基本组件:Activity、ContentProvider、Service以及BroadcastReceiver,前面的两个我们在前几篇已经具体讲解了,今天这一天我们就把后两者的使用具体说一下,由于Service和BroadcastReceiver常常一起使用,所以我们一起来学习。

一.Service的使用

Service是Android系统的后台服务组件,没有用户界面,但可以长时间的运行,比Activity的优先级高,可以用于进程间的通信。

Service也同Activity一样有自己的生命周期,但是Service有两种生命周期,也就是Service由两种启动以及对应的停止方式:

1.以启动方式使用的Service:

(1)特点:

A.通过Content.startService()启动,Content.stopService()或者Content.stopSelf()来停止;

(即只能通过其他组件启动,但可以自己停止)

B.不能与外部的组件进行交互;

(2)生命周期:

onCreate——>onStartCommand——>onDestroy

(3)示例代码:L0828_Service(记得注册)

MyService.java:

  1. package com.example.l0828_service;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.IBinder;
  7. public class MyService extends Service{
  8. //声明定时器,用于创建新的进程来计时
  9. private Timer timer;
  10. private TimerTask task;
  11. private static int i=;
  12. //继承Service必须要重写的方法onBind
  13. @Override
  14. public IBinder onBind(Intent intent) {
  15. return null;
  16. }
  17. /*Service的生命周期一:onCreate、onStartCommand、onDestroy方法构成*/
  18. //onCreate方法,启动服务,每次启动仅仅调用一次
  19. @Override
  20. public void onCreate() {
  21. System.out.println("onCreate");
  22. super.onCreate();
  23. }
  24. //onStartCommand方法,一般在其中完成Service的工作
  25. @Override
  26. public int onStartCommand(Intent intent, int flags, int startId) {
  27. System.out.println("onStartCommond");
  28. startTimer();
  29. return super.onStartCommand(intent, flags, startId);
  30. }
  31. //onDestroy方法,用来释放Service的资源
  32. @Override
  33. public void onDestroy() {
  34. System.out.println("onDestroy");
  35. stopTimer();
  36. super.onDestroy();
  37. }
  38. //开启定时器
  39. public void startTimer(){
  40. timer =new Timer();
  41. task=new TimerTask(){
  42. @Override
  43. public void run() {
  44. i++;
  45. System.out.println(i);
  46. }
  47. };
  48. timer.schedule(task, , );
  49. }
  50. //停止定时器
  51. public void stopTimer(){
  52. timer.cancel();
  53. }
  54. }

Mainactivity.java:

  1. package com.example.l0828_service;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. public class MainActivity extends Activity implements OnClickListener{
  9. private Button btn_start,btn_stop;
  10. //声明Intent用于Activity向Service的跳转
  11. private Intent intent;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. btn_start=(Button) findViewById(R.id.btn_start);
  17. btn_stop=(Button) findViewById(R.id.btn_stop);
  18. btn_start.setOnClickListener(this);
  19. btn_stop.setOnClickListener(this);
  20. //Activity组件向Service组件的跳转
  21. intent=new Intent(MainActivity.this,MyService.class);
  22. }
  23. @Override
  24. public void onClick(View v) {
  25. switch (v.getId()) {
  26. case R.id.btn_start:
  27. //开启服务
  28. startService(intent);
  29. break;
  30. case R.id.btn_stop:
  31. //停止服务
  32. stopService(intent);
  33. break;
  34. }
  35. }
  36. }

主配置文件.xml文件中注册:

  1. <service android:name="MyService"></service>

运行效果:

起始界面

点击开始——停止的过程显示:

停止之后再次点击开始按钮又重新执行onCreate方法:

2.以绑定方式使用的Service:

(1)特点:

A.通过Content.bindService()绑定而建立与服务器的连接,通过Content.unbindService()方法解除绑定从而断开与服务器的连接;

B.如果没有调用startService直接通过调用bindService绑定服务器也会自动启动服务器;

C.能获得Service的对象,从而能够使得其他组件与Service的交互;

D.同一个Service可以绑定多个服务连接,同时与不同的组件交互;

(2)生命周期:

onCreate——>onBind——>onCommand——>onUnbind——>onRebind——>onDestroy

如果onUnbind方法返回true,则当取消绑定之后重写绑定服务时就直接调用onRebind方法了。

(3)示例代码:

MyService.java:

  1. package com.example.l0828_service2;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.Binder;
  7. import android.os.IBinder;
  8. public class MyService extends Service{
  9. private Timer timer;
  10. private TimerTask task;
  11. private int i=;
  12. private int j=;
  13. //创建内部类,用于创建Binder对象,onBinder方法中使用
  14. class MyBinder extends Binder{
  15. public MyService getService(){
  16. return MyService.this;
  17. }
  18. }
  19. private MyBinder binder=new MyBinder();
  20. public int getI() {
  21. return i;
  22. }
  23. public void setI(int i) {
  24. this.i = i;
  25. }
  26.  
  27. public int getJ() {
  28. return j;
  29. }
  30. public void setJ(int j) {
  31. this.j = j;
  32. }
  33. //下面分别重写Service生命周期的方法
  34. @Override
  35. public IBinder onBind(Intent intent) {
  36. //绑定服务,开始于界面交互
  37. startTimer();
  38. System.out.println("onBind");
  39. return binder;
  40. }
  41. @Override
  42. public void onCreate() {
  43. System.out.println("onCreate");
  44. super.onCreate();
  45. }
  46. @Override
  47. public int onStartCommand(Intent intent, int flags, int startId) {
  48. System.out.println("onStartCommand");
  49. return super.onStartCommand(intent, flags, startId);
  50. }
  51. @Override
  52. public boolean onUnbind(Intent intent) {
  53. //解除与服务器的绑定,停止与界面的交互
  54. stopTimer();
  55. System.out.println("onUnbind");
  56. //为了使onRebind能够调用到,使得onUnbind的返回值为true
  57. super.onDestroy();
  58. return true;
  59. }
  60. @Override
  61. public void onRebind(Intent intent) {
  62. System.out.println("onRebind");
  63. super.onRebind(intent);
  64. }
  65. @Override
  66. public void onDestroy() {
  67. System.out.println("onDestroy");
  68.  
  69. }
  70. //创建定时器,即创建另一个线程负责计时
  71. public void startTimer(){
  72. timer=new Timer();
  73. task=new TimerTask() {
  74.  
  75. @Override
  76. public void run() {
  77. i++;
  78. if(i==j){
  79. System.out.println("此时您输入的数据于服务数据相同:"+j);
  80. }
  81. System.out.println(i);
  82. }
  83. };
  84. timer.schedule(task, ,);
  85. }
  86. //停止计时
  87. public void stopTimer(){
  88. timer.cancel();
  89. }
  90. }

MainActivity.java:

  1. package com.example.l0828_service2;
  2. import com.example.l0828_service2.MyService.MyBinder;
  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.Bundle;
  8. import android.os.IBinder;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13. import android.widget.Toast;
  14. public class MainActivity extends Activity implements OnClickListener,ServiceConnection{
  15. private Button btn_bind,btn_unBind,btn_getService,btn_start,btn_stop;
  16. private Intent intent;
  17. private MyService myservice;
  18. private EditText et;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. et=(EditText) findViewById(R.id.et);
  24. btn_bind=(Button) findViewById(R.id.btn_bind);
  25. btn_unBind=(Button) findViewById(R.id.btn_unBind);
  26. btn_getService=(Button) findViewById(R.id.btn_getService);
  27. btn_start=(Button) findViewById(R.id.btn_start);
  28. btn_stop=(Button) findViewById(R.id.btn_stop);
  29. btn_bind.setOnClickListener(this);
  30. btn_unBind.setOnClickListener(this);
  31. btn_getService.setOnClickListener(this);
  32. btn_start.setOnClickListener(this);
  33. btn_stop.setOnClickListener(this);
  34. intent=new Intent(MainActivity.this, MyService.class);
  35. }
  36. @Override
  37. public void onClick(View v) {
  38. switch (v.getId()) {
  39. case R.id.btn_bind:
  40. bindService(intent, this, BIND_AUTO_CREATE);
  41. break;
  42. case R.id.btn_unBind:
  43. unbindService(this);
  44. break;
  45. case R.id.btn_getService:
  46. String info=et.getText().toString();
  47. if("".equals(info)){
  48. Toast.makeText(MainActivity.this,"当前的i值:"+myservice.getI() , Toast.LENGTH_SHORT).show();
  49. }
  50. myservice.setJ(Integer.parseInt(info));
  51. break;
  52. case R.id.btn_start:
  53. startService(intent);
  54. break;
  55. case R.id.btn_stop:
  56. stopService(intent);
  57. break;
  58. }
  59. }
  60. @Override
  61. public void onServiceConnected(ComponentName name, IBinder service) {
  62. MyService.MyBinder binder=(MyBinder) service;
  63. myservice=binder.getService();
  64. }
  65. @Override
  66. public void onServiceDisconnected(ComponentName name) {
  67.  
  68. }
  69.  
  70. }

运行效果:

初始界面:

依次点击start、bind、unbind、输入一个服务还未计时到的数、getService、stop的过程:

下图是上面执行过程的输出情况,可以清晰明了的看出整个执行的过程:

下面是这样的执行顺序的结果:

start、bind、输入及时数据、getService、unbind、(正是此时调用了onRebind方法)bind、unbind、stop的过程

二.BroadcastReceiver的使用

1.使用广播实现简单的数据接收功能:

(1)MainActivity.java:

  1. package com.example.l0829_broadcastreceiver;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. public class MainActivity extends Activity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. findViewById(R.id.btn_send).setOnClickListener(new OnClickListener() {
  13.  
  14. @Override
  15. public void onClick(View v) {
  16. //仍然是使用Intent来实现组件之间的跳转
  17. Intent intent=new Intent(MainActivity.this, MyBroadCastReceiver.class);
  18. //把要向广播接收器发送的数据用Intent对象封装,注意键值要相同
  19. intent.putExtra("name", "我接收到了");
  20. //发送数据
  21. sendBroadcast(intent);
  22. }
  23. });
  24. }
  25. }

(2)MyBroadcastReceiver.java:

  1. package com.example.l0829_broadcastreceiver;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. //继承BroadcastReceiver
  6. public class MyBroadCastReceiver extends BroadcastReceiver{
  7. //只需重写OnReceiver方法
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. //接收特定键值的数据,实现广播接收器的基本功能
  11. String str=intent.getStringExtra("name");
  12. System.out.println(str);
  13. }
  14. }

(3)一定不要忘记注册啊(四大基本组件是都需要在主配置文件中注册的):

  1. <receiver android:name="MyBroadCastReceiver"></receiver>

2.再实现一个系统默认广播的例子——电量改变的广播:

(1)MainActivity.java

  1. package com.example.l0829_system_broadcastreceiver;
  2. import android.app.Activity;
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.os.Bundle;
  8. import android.widget.TextView;
  9. public class MainActivity extends Activity {
  10. //创建一个广播的实例,在其onReceive方法中实现接收的过程
  11. private BroadcastReceiver myBR=new BroadcastReceiver(){
  12. @Override
  13. public void onReceive(Context context, Intent intent) {
  14. //if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))这里也可以先判断一下,确保正确性
  15. //下面就是接收系统当前电量信息的过程,注意这里的键值level和scale是系统固定值,不能改变
  16. int level=intent.getIntExtra("level", );
  17. int scale=intent.getIntExtra("scale", );
  18. tv.setText("当前电量:"+level*/scale+"%");
  19. }
  20. };
  21. //声明一个TextView用来显示接受的当前电量值
  22. private TextView tv;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. tv=(TextView) findViewById(R.id.tv_receive);
  28. //动态注册广播的方法,在onCreate方法中
  29. registerReceiver(myBR, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
  30. }
  31. @Override
  32. protected void onStop() {
  33. //在onStop方法中取消广播的注册
  34. unregisterReceiver(myBR);
  35. super.onStop();
  36. }
  37. }

(2)由于在代码中实现了Receiver的动态注册,那么主配置文件中就不用注册了

(3)运行效果:(有点小哈,凑合看看吧)

(另外有一个温馨提示:模拟器的电量值永远是50%,可以用真机测试)

3.最后算是来个总结吧:

我们实现一个Activity、Service、BroadcastReceiver三大组件结合使用的例子,完成Service始终在后台计时、BroadcastReceiver接收数据并及时更新主Activity的过程:

(1)MyService.java

  1. package com.example.l0829_zujian_all;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.IBinder;
  7. public class MyService extends Service{
  8. private Timer timer;
  9. private TimerTask task;
  10. private int i=;
  11. private Intent intent;
  12. public int getI() {
  13. return i;
  14. }
  15. public void setI(int i) {
  16. this.i = i;
  17. }
  18. @Override
  19. public void onCreate() {
  20. //开始服务
  21. startTimer();
  22. super.onCreate();
  23. }
  24. @Override
  25. public int onStartCommand(Intent intent, int flags, int startId) {
  26. return super.onStartCommand(intent, flags, startId);
  27. }
  28. @Override
  29. public IBinder onBind(Intent intent) {
  30. return null;
  31. }
  32. @Override
  33. public boolean onUnbind(Intent intent) {
  34. return super.onUnbind(intent);
  35. }
  36. @Override
  37. public void onRebind(Intent intent) {
  38. super.onRebind(intent);
  39. }
  40. @Override
  41. public void onDestroy() {
  42. //停止服务
  43. stopTimer();
  44. super.onDestroy();
  45. }
  46. public void startTimer(){
  47. timer=new Timer();
  48. task=new TimerTask() {
  49.  
  50. @Override
  51. public void run() {
  52. i++;
  53. //在计时器中及时向ACTION_MY的BroadcastReceiver接收器中发送键值为id的数据
  54. intent=new Intent();
  55. intent.setAction("ACTION_MY");
  56. intent.putExtra("id", i);
  57. sendBroadcast(intent);
  58. }
  59. };
  60. timer.schedule(task, ,);
  61. }
  62. public void stopTimer(){
  63. timer.cancel();
  64. }
  65. }

(2)MainActivity.java

  1. package com.example.l0829_zujian_all;
  2. import android.app.Activity;
  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.IntentFilter;
  7. import android.os.Bundle;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.TextView;
  12. public class MainActivity extends Activity implements OnClickListener{
  13. //创建接收器对象,并在onReceive方法中接收键值为id的数据
  14. private BroadcastReceiver br=new BroadcastReceiver() {
  15.  
  16. @Override
  17. public void onReceive(Context context, Intent intent) {
  18. int val=intent.getIntExtra("id", );
  19. System.out.println(intent.getIntExtra("id", ));
  20. tv_show.setText(val+"");
  21. }
  22. };
  23. private Button btn_start,btn_stop;
  24. private TextView tv_show;
  25. private Intent intent;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_main);
  30. tv_show=(TextView) findViewById(R.id.tv_show);
  31. btn_start=(Button) findViewById(R.id.btn_start);
  32. btn_stop=(Button) findViewById(R.id.btn_stop);
  33. btn_start.setOnClickListener(this);
  34. btn_stop.setOnClickListener(this);
  35. intent=new Intent(MainActivity.this, MyService.class);
  36. //接收器的动态注册,Action必须与Service中的Action一致
  37. registerReceiver(br, new IntentFilter("ACTION_MY"));
  38. }
  39. @Override
  40. public void onClick(View v) {
  41. switch (v.getId()) {
  42. case R.id.btn_start:
  43. startService(intent);
  44. break;
  45. case R.id.btn_stop:
  46. stopService(intent);
  47. break;
  48. }
  49. }
  50. @Override
  51. protected void onDestroy() {
  52. //取接收器的消注册
  53. unregisterReceiver(br);
  54. super.onDestroy();
  55. }
  56. }

(3)注册Service,而BroadcastReceiver就不用再注册了

(4)运行效果:

即一个计时更新主页面的功能

Android Service和广播的更多相关文章

  1. Android -- service 利用广播调用服务的方法

    1. 实现原理,在Service里面注册一个广播接收者, 想要调用的时候app发送出广播, 后台的service里面的广播接收者接收到广播,并调用service里面的方法. 2. 示例代码 MainA ...

  2. android service 的各种用法(IPC、AIDL)

    http://my.oschina.net/mopidick/blog/132325 最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇 ...

  3. Android之旅---广播(BroadCast)

    什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们 ...

  4. Android中的广播

    Android中的广播 广播接受器,可以比喻成收音机.而广播则可以看成电台. Android系统内部相当于已经有一个电台 定义了好多的广播事件,比如外拨电话 短信到来 sd卡状态 电池电量变化... ...

  5. 【Android】详解Android Service

    目录结构: contents structure [+] Service简单概述 Service在清单文件中的声明 Service启动服务 Service绑定服务 扩展Binder类 使用Messen ...

  6. 浅谈android Service和BroadCastReceiver

    1.题记 Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 广播接收者(BroadcastRece ...

  7. Android Service总结05 之IntentService

    Android Service总结05 之IntentService   版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...

  8. Android Service总结04 之被绑定的服务 -- Bound Service

    Android Service总结04 之被绑定的服务 -- Bound Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Skywa ...

  9. Android Service总结02 service介绍

    Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容. 2013-03-16 Skywang ...

随机推荐

  1. WPF 使用定时器

    WPF 使用定时器:<ProgressBar Height="10" HorizontalAlignment="Left" Margin="28 ...

  2. Java集合的小抄

    在尽可能短的篇幅里,将所有集合与并发集合的特征.实现方式.性能捋一遍.适合所有"精通Java",其实还不那么自信的人阅读. [转自:花钱的年华] 期望能不止用于面试时,平时选择数据 ...

  3. 【转载】MySQL 日志 undo | redo

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  4. Fat-tree 胖树交换网络

    胖树架构下,网络带宽不收敛 传统的树形网络拓扑中,带宽是逐层收敛的,树根处的网络带宽要远小于各个叶子处所有带宽的总和. 而胖树网络则更像是真实的树,越到树根,枝干越粗,即:从叶子到树根,网络带宽不收敛 ...

  5. Linq to XML 之XElement的Descendants方法的新发现

    C#操作XML的方法有很多,但个人认为最方便的莫过于Linq to XML了,特别是XElement的Descendants方法是我最常用的一个方法. 这个方法可以根据节点名(Name)找到当前调用的 ...

  6. SharePoint 2010/SharePoint 2013 Custom Action: 基于Site Collection 滚动文字的通知.

    应用场景: 有时候我们的站点需要在每个页面实现滚动文字的通知,怎么在不修改Master Page的情况下实现这个功能?我们可以使用Javascript 和 Custom Action 来实现. 创建一 ...

  7. VBS基础篇 - wscript 对象

    一.wscript对象 描述:提供对 Windows 脚本宿主对象模型根对象的访问.详述:WScript 对象是 Windows 脚本宿主对象模型层次结构的根对象.它可在任何脚本文件中使用,不需要特定 ...

  8. python学习小结9:面向对象

    面向对象技术 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...

  9. SQL Server备份事务日志结尾(Tail)

    原文:http://blog.csdn.net/tjvictor/article/details/5256906   事务日志结尾经常提交数据库未备份的事务日志内容.基本上,每一次你执行事务日志备份时 ...

  10. Jenkins入门-转

    reference : http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html 在网上貌似没有找到Jenkins的中文的太多的文档,有 ...