android service

本文详细介绍了Android中Service的基础知识,包括Service的生命周期、启动与销毁过程,以及如何在Activity中绑定Service。此外,还提供了在BroadcastReceiver中启动Service的具体示例。

service基础

 

service 和activity 一样, 也有一个从启动到销毁的过程,但是Service的声明周期相对要简单些,如下3个阶段:

 

 * 创建服务    * 开始服务  * 销毁服务

 

  一个服务实际上是一个继承android.app.Service的类。当service经历上面3个阶段时候,会调用相应的方法。

  public void onCreate();

  public void onStart(intent intent , int startId);

  public void onDestroy();

 

  一个服务之会创建一次,销毁一次,但可以开始多次。也就是说onCreate() 和OnDestroy()方法只会被执行一次,OnStart()方法可以执行多次。

 

  我们在用服务的时候,不仅要继承service类,重写其中的方法,而且在androidmenifest.xml文件中,我们也应该进行配置。

  在<application>标签中加入如下代码:<service android:enabled="true' android:name=".MyService"/>

  其中android:enabled="true",表示MyService服务处于激活状态,虽然目前MyService是激活的,但是系统不会启动MyService,想要启动服务,必须

  显示的调用startService()方法。停止服务的话,调用显示stopService().

 

 

   关于服务的创建和开始服务,有两点需要注意:

     (1) 编写一个服务类,该类继承android.app.Service类。Service类涉及到三个声明周期,但是这个三个声明周期在子类中并不一定需要完全

              覆盖,可根据需求取舍。在该类中有一个onBind()抽象方法,该方法是一个抽象方法,在Service()子类中必须覆盖,这个方法在 Service

              Activity进行绑定的时候被调用。

 

     (2) 在androidmenifest.xml文件中配置<service>标签来对service 进行配置,并将其中的android:enabled属性设置为true.

 

       ( 3 ) 调用startService()方法启动服务。停止服务用stopService().

 

 

  Activity和Service绑定

 

         如果我们仅仅是如上说的,调用startService()方法来启动服务,并未调用stopServie()方法,那么这个服务就会随着android系统的启动而期

         启动,关闭而关闭。就是说该服务启动后就一直在后台运行,直到系统android 系统关闭。如果我们希望在启动服务的activity关闭之后,该

         服务也关闭,那么我们就要将activity于服务绑定。

 

  参考下面:

   

当一个 Activity 绑定到一个 Service 上时,它负责维护 Service 实例的引用,允许你对正在运行的 Service 进行一些方法调用。

 

 Activity 能进行绑定得益于 Service 的接口。为了支持 Service 的绑定,实现 onBind 方法 如下所示:

 

private final IBinder binder = new MyBinder();

 

@Override

public IBinder onBind(Intent intent) {

return binder;

}

 

public class MyBinder extends Binder {

MyService getService()

{

return MyService.this;

}

}

 

Service Activity 的连接可以用 ServiceConnection 来实现。你需要实现一个新的 ServiceConnection ,重写 onServiceConnected onServiceDisconnected 方法,一旦连接建立,你就能得到 Service 实例的引用。

 

// Reference to the service

private MyService serviceBinder;

 

// Handles the connection between the service and activity

private ServiceConnection mConnection = new ServiceConnection()

{

public void onServiceConnected(ComponentName className, IBinder service) {

// Called when the connection is made.

serviceBinder = ((MyService.MyBinder)service).getService();

}

 

public void onServiceDisconnected(ComponentName className) {

// Received when the service unexpectedly disconnects.

serviceBinder = null;

}

};

 

执行绑定,调用 bindService 方法,传入一个选择了要绑定的 Service Intent (显式或隐式)和一个你实现了的 ServiceConnection 实例,如下的框架代码所示:

 

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

// Bind to the service

Intent bindIntent = new Intent(MyActivity.this, MyService.class);

bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);

}

 

以上总结三点

     (1):Service为了支持被绑定,实现了onBind()方法。 并在其中返回一个IBinder对象, IBinder类中

               有获得SERVICE实例的方法。

     (2):在Activity中实现用于连接SERVICE和Activity的 ServiceConnection, 一旦连接建立,你就能得到 Service 实例的引用。(相对于第三步来说,第二步的实现是具体的操作。)

    (3) 执行绑定,调用 bindService 方法.(相对于第二步来讲,相当于发送命令。)

 

 

一旦 Service 对象找到,通过 onServiceConnected 处理函数中获得 serviceBinder 对象就能得到它的公共方法和属性。

 

Android 应用程序一般不共享内存,但在有些时候,你的应用程序可能想要与其它的应用程序中运行的 Service 交互。

 

你可以使用广播 Intent 或者通过用于启动 Service Intent 中的 Bundle 来达到与运行在其它进程中的 Service 交互的目的。如果你需要更加紧密的连接的话,你可以使用 AIDL Service 跨越程序边界来实现绑定。 AIDL 定义了系统级别的 Service 的接口,来允许 Android 跨越进程边界传递对象。

 

 在BroadcastReceiver中启动service

 

   如上,我们在启动服务的时候都是先启动了一个activity,然后在activity中启动服务。如果是这样的,稍显复杂了。我们能利用

   BroadcastReceiver在系统启动的时候就运行某个服务。这个原理和启动activity 是一样的。

 

    下面是个简单的例子

 

            public class StartupReciver extends BroadcastReceiver{

                  @Override

                   public void onReceive(Context, Intent intent){

                    Intent serviceIntent = new Intent(context,MyService.class);

                    context.startService(serviceIntent);

                    Intent activityIntent = new Intent(context,MessageActivity.class);

                    // 一般我们在BroadcastReceiver中启动activity的话,必须设置如下标识。

                    activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                    startActivity(activityIntent);    

                       }

 

 

          }

 

         上面代码启动了一个服务和一个activity.

 

   在androidmenifest.xml 文件中的配置如下:

 

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.blogjava.mobile.startupservice" android:versionCode="1"
    android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MessageActivity"  android:theme="@android:style/Theme.Dialog" >
            <intent-filter>                
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
        <receiver android:name="StartupReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
        <service android:enabled="true" android:name=".MyService" />
    </application>
    <uses-sdk android:minSdkVersion="3" />
    
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest> 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值