`
zhanhao
  • 浏览: 285459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android Service 与Activity绑定

阅读更多

Service是android的四大组件之一,地位相当重要。Service是没有实际界面,在后台运行的。

Service的生命周期比起Activity的少多了:创建服务,开始服务,销毁服务

创建服务和销毁服务只会一次,而开始服务可以执行多次

使用服务:

(1) 编写类继承自android.app.Service。

  import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {


 //服务生命周期 创建,开始,销毁
 /**
  * 创建
  */
 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  Log.d("info", "Service Create");
 }
 /*
  * 开始
  * (non-Javadoc)
  * @see android.app.Service#onStart(android.content.Intent, int)
  */
 @Override
 public void onStart(Intent intent, int startId) {
  // TODO Auto-generated method stub
  super.onStart(intent, startId);
  Log.d("info", "Service Start");
 }
 /**
  * 销毁
  */
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  Log.d("info", "Service Destroy");
 }

 

 /**
  * 当Service与Activity成功绑定时调用这个方法(non-Javadoc)
  * @see android.app.Service#onBind(android.content.Intent)
  */
 @Override
 public IBinder onBind(Intent arg0) {
  Log.d("info","Service Bind Success");
  return null;
 }
 /**
  * 重新绑定
  */
 @Override
 public void onRebind(Intent intent) { 
  super.onRebind(intent);
  Log.d("info","Service ReBind Success");
 }
 /**
  * 取消绑定
  */
 @Override
 public boolean onUnbind(Intent intent) {
  
  Log.d("info","Service Unbind Success");
  return super.onUnbind(intent);
  
 }
 

}

(2)  在AndroidManifest.xml中配置<service>标签

<service android:name=".MyService" android:enabled="true" ></service>

(3)使用通过万能的Intent

--启动服务

Intent intent = new Intent(Main.this,MyService.class);  

Main.this.startService(intent);

--停止服务

Main.this.stopService(intent);

通常情况下 我们希望应用关闭Service就会能停止,这就要通过Service与Activity的绑定来实现

绑定服务:

(1) 通过使用Activity的bindService(Intent service,ServiceConnection conn,int flags)完成

     由该方法的第二个参数可以确定第二步要做什么

(2) 编写类实现ServiceConnection 接口

  class MyServiceConnection implements ServiceConnection
    {

  @Override
  public void onServiceConnected(ComponentName arg0, IBinder arg1) {
   Log.d("info", "Service Connection Success");
   //连接成功执行
  }

  @Override
  public void onServiceDisconnected(ComponentName arg0) {
   // TODO Auto-generated method stub
   Log.d("info", "Service Connection Filed");
   //连接失败执行
  }
     
    }

(3)使用

    class BtnClick implements OnClickListener
    {
      @Override
  public void onClick(View arg0) {
   Intent intent = new Intent(Main.this,MyService.class);   
   MyServiceConnection myServiceConnection = new MyServiceConnection();
   switch (arg0.getId()) {
   case R.id.btnStart:        
    Main.this.startService(intent);
    
    break;
   case R.id.btnStop:    
    Main.this.stopService(intent);
    break;
   case R.id.btnBind:
    
    Main.this.bindService(intent,connection ,Context.BIND_AUTO_CREATE);
    break;  
   case R.id.btnUnBind:
    //ServiceConnection必须是全局变量否则此处报错
    Main.this.unbindService(connection);
    break;
   default:
    break;
   }   
  }
     
    }

       Android/Ophone书上说:要想Service随着Activity的销毁而销毁 必须的先绑定Service后启动Service(多次尝试后发现这句话不对)。
      运行Android/Ophone的示例代码src\ch08\ch08_serviceactivity 与书上186页最后一段文字表达的意思不相符
     书上的意思是开始服务与绑定服务的先后顺序会影响到onDestroy()的调用,但是事实上并非如此
     (1) Start Service --Bind Service -- 关闭应用 结果:
    Log输出:  onCreate onStart -- onBind -- onUnbind
     (2)Bind Service -- Start Service --关闭应用 结果:
      Log输出: onCreate onBind -- onStart -- onUnbind
     (1)(2)的结果一样  都没有调用onDestroy()方法
     发现Service与Activity绑定之后没有效果,继续尝试,发现了一些有趣的现象
     (3)Start Service -- Bind Service -- Stop Service --关闭应用 结果:
      Log输出: onCreate onStart -- onBind --(没有效果)--onUnBind onDestroy
     (4)Bind Service -- Start Service -- Stop Service -- 关闭应用 结果:
     Log输出: onCreate onBind -- onStart -- (没有效果) -- onUnBind onDestroy
     (1)(2)(3)(4)得知:
     a.开始服务与绑定服务的先后顺序与关闭应用后是否销毁服务无关
     b.在绑定服务后,是否调用stopService() 与 关闭应用后是否销毁服务有关
     c.Service与Activity绑定后调用stopService()服务不会立刻调用onDestroy()方法,直到应用关闭后才会调用

书中的示例源代码在附件中,大家自己可以尝试一下,看看对不对。

0
0
分享到:
评论
1 楼 a_lee 2012-11-30  
看下

相关推荐

    最简洁的service和activity绑定

    实现activity和service绑定,没有冗余代码,仅仅为了说明绑定

    Android service activity服务绑定测试源码.rar

    这是一个简单的围绕Android service activity来进行服务绑定的测试源码,比如 进行开始服务、关闭服务、绑定服务和解绑服务的测试,在android虚拟机上的运行效果,请参见下图所示。这是比较基础的android初级例子,...

    android普通类绑定service

    3、普通类可以绑定service,但是需要activity传入一个Contex参数 4、该测试可以将业务代码和activity或者service分离,实现程序更好的结构,提高代码可读性 5、欢迎大家一起讨论改正,qq125437753

    Android IPC机制ACtivity绑定Service通信代码实例

    Binder通信过程类似于TCP/IP服务连接过程binder四大架构Server(服务器),Client(客户端),ServiceManager(DNS)以及Binder驱动(路由器) 其中Server,Client,ServiceManager...import android.os.Parcel; import andr

    service后台运行实时更新activity

    service在后台计时,传值返回activity,在activity中的textView实时更新的程序。采用service和handler两个知识点实现。

    Android服务Service详解

    本章内容服务(Service)是Android系统中4个应用程序组件之... 绑定Activity和Service  在BroadcastReceiver中启动Service  系统服务  时间服务  在线程中更新GUI组件  AIDL服务  在AIDL服务中传递复杂的数据  

    Android服务Service_详解

    Service的生命周期 绑定Activity和Service 在BroadcastReceiver中启动Service 系统服务 时间服务 在线程中更新GUI组件 AIDL服务 在AIDL服务中传递复杂的数据

    Android Service中方法使用详细介绍

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务。例如,一个从service播放音乐的音乐播放器,应被设置为前台运行,因为用户会明确地注意它的运行.在状态栏中的通知可能会显示...

    Android中service基本用法,生命周期1

    服务就是默默的在后台工作 服务的有两种启动方式,对应两个生命周期 startService启动方式,只在activity中启动...bindService启动方式,和activity绑定后,和activity共存亡,activity退出,服务停止,对应生命周期:

    BindService绑定Service播放音乐

    1. 使用了BindService绑定Service。 2. 使用Boardcast,Service发送广播通知Activity更新进度条进度,歌曲状态更新等。

    android 实验6服务

    在提供的项目CreateService的基础上,实现以下功能:主Activity绑定服务,服务的业务逻辑为:子线程暂停5秒钟,然后发送一条通知,点击通知能否返回主Activity。 具体步骤: Step 1创建一个服务类继承自Service,在...

    Android中service基本用法,生命周期2

    服务就是默默的在后台工作 服务的有两种启动方式,对应两个生命周期 startService启动方式,只在activity中启动...bindService启动方式,和activity绑定后,和activity共存亡,activity退出,服务停止,对应生命周期:

    Android Service demo

    demo中主要有本地service和远程service的启动(绑定),关闭(解绑),以及service与activity通信

    Android四大组件之Service

    Android四大组件之ServiceService的生命周期被启动(startService)的服务的生命周期:被绑定(bindService)的服务的生命周期:被启动又被绑定的服务的生命周期:实例布局创建Service类启动ServiceDemo下载 android开发...

    Android stuido安卓小程序

    实现服务的onCreate(),重写onbind()方法,销毁onDestroy()方法如果 Activity 绑定,Activity 就可以取到 IBinder 对象,可以直接调用对象的方法,相同应用内部不同组件绑定,可以使用内部类以及Binder对象来...

    Android IPC机制绑定Service实现本地通信

    这一章是为下面的Messenger和AIDL的使用做准备,主要讲解Android Service的绑定和Activity与本地Service之间通信相关知识。** 简介 我们都知道启动Service有两种方式:startService()和bindService()。相比第一种...

    Android Mediaplayer本地音乐播放器(绑定服务)

    本文章介绍MediaPlayer本地音乐...Activity与绑定服务Service之间的交互是本文章的重点(这里需要说明一点的是,Activity不能直接访问服务对象中的方法,所以才有了我们一下的介绍,这也是为服务的安全等方面的考虑)。

    Android在后台最小化的多线程下载程序实例.rar

    service 与activity 之间的消息通信 既是activity向service发消息 需要实现ServiceConnection接口 绑定服务, 第一次启动BackStage的Activity时启动接收广播,需要知道当前SD卡的目录,Environment....

    Android中Service(后台服务)详解

    1.概念: ...播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用。 (2).如果说Activity是显示前台页面的信息,那么Service就是在后台进行操作的。如果Serv

Global site tag (gtag.js) - Google Analytics