`
zhanhao
  • 浏览: 286906 次
  • 性别: 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  
看下

相关推荐

    Activity绑定Service(Kotlin)

    总结,Activity绑定Service在Kotlin中是一项重要的技能,它允许我们在不显示用户界面的情况下执行后台任务并保持与Activity的通信。通过理解Service的生命周期、使用Kotlin的特性以及正确的通信机制,开发者可以构建...

    最简洁的service和activity绑定

    将Service与Activity绑定是Android开发中常见的需求,它允许Activity直接与Service通信,获取Service的状态或控制Service的生命周期。本教程将详细介绍如何在Android中实现最简洁的Service和Activity绑定。 一、...

    android多个activity和一个service通信

    2. **Binder**: Service通过实现IBinder接口,提供一个 Binder 对象给Activity绑定。Activity通过bindService()方法获取到Binder对象,从而可以直接调用Service的方法。这种方式效率较高,但需要编写较多代码,并且...

    Android Service与Activity会话Demo

    本示例"Android Service与Activity会话Demo"旨在教你如何在Android Studio中实现Service与Activity之间的通信,这对于创建功能丰富的应用程序至关重要。 Service是Android系统的一个组件,它可以在没有用户界面的...

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

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

    Service向Activity传值(kotlin)

    在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中的“Service向Activity传值,实现Count累加的效果。定时传值”。这种需求常见于实时更新UI或者进行后台计数等操作。 首先,我们来详细...

    android如何绑定service

    在本文中,我们将深入探讨如何在Android应用中绑定Service,这通常用于实现客户端-服务器通信,使得应用程序可以与Service进行交互、传递数据或控制Service的行为。 一、Service生命周期 在理解绑定Service之前,...

    Android service 传 activity

    总之,Android中Service与Activity的通信是通过bindService()和自定义的Binder对象实现的。这种方式使得Activity能够动态地获取Service中的数据,更新用户界面,从而提供更好的用户体验。在实际开发中,要根据需求...

    Android中Service与Activity之间通信的几种方式

    在Android应用开发中,Service与Activity之间的通信是一个重要的主题,因为它们各自承担着不同的职责:Activity作为用户界面的载体,Service则用于执行后台任务。在本文中,我们将深入探讨两种常见的Service与...

    android中activity和service的交互

    首先,我们来看`BindService`,这是Android中Activity绑定Service的主要方式。通过绑定,Activity可以与Service建立连接,并进行通信,获取Service的方法调用,甚至监控Service的状态。绑定服务的优点在于它可以提供...

    Android开发-Activity与Service使用Messenger通信代码

    在Android应用开发中,Activity和Service是两个非常重要的组件。Activity负责用户界面的展示,而Service则用于在后台执行长时间运行的任务,不依赖用户界面。然而,在某些情况下,Activity需要与Service进行通信,...

    android Service Activity三种交互方式(付源码)

    // 在Activity中绑定Service并调用Binder方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { MyBinder binder = (MyBinder) service; binder.doSomething(); } // 解绑...

    Service与多个Activity交互

    2. **绑定Service:** 使用bindService()方法,Activity可以与Service建立连接,进行更直接的交互。这种方式下,Service只在有连接时运行,断开连接后自动停止。 **Service与Activity通过Broadcast交互的步骤:** 1...

    android普通类绑定service

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

    service与activity之间的通信

    总结,Service与Activity之间的通信是Android开发中的核心技能,合理利用可以提高用户体验,同时避免不必要的内存泄漏。通过startService()、bindService()、BroadcastReceiver以及AIDL,开发者可以根据实际需求选择...

    service后台运行实时更新activity

    在Android应用开发中,"Service后台运行实时更新Activity"是一个常见的需求,主要涉及到Service、Handler以及UI更新等关键概念。Service是Android系统的一种组件,它能够在后台长时间运行,即使用户离开了应用程序...

    Android绑定serviceDemo

    bindService方法是Android提供的API,用于将Activity与Service进行绑定。以下是如何使用bindService的步骤和关键知识点: 1. **服务定义**:首先,你需要在服务类中继承自Service,并重写onBind方法。这个方法返回...

    初识 Service(三) 演示:Service给 Activity传递消息

    在Android应用开发中,`Service` 是一个非常重要的组件,它允许应用程序在后台长时间运行,即使用户界面(UI,如Activity)已经关闭。本篇我们将深入探讨如何在Service与Activity之间进行交互,尤其是Service如何向...

    Activity中使用AIDL让Service与Activity通信

    有时,我们可能需要在Activity中控制Service或者传递数据给Service,这时就需要利用Android Interface Definition Language(AIDL)来实现Service与Activity之间的进程间通信(IPC,Inter-Process Communication)。...

Global site tag (gtag.js) - Google Analytics