程序员人生 网站导航

第四章 Android开发三大基石―Activity、Service和Handler(4)

栏目:综合技术时间:2015-01-29 08:52:24

4.2 千变万化的服务-Service开发

Service是Android系统中运行在后台、不和用户交互利用组件。它和Activity的级别差不多,只能在后台运行。每一个Service必须在manifest文件中 通过<service>来声明。

4.2.1 Service的生命周期

Service的生命周期其实不像Activity那末复杂,它只继承了onCreate(),onStart(),onDestroy()3个方法,当我们第1次启动Service的时候,前后调用onCreate()、onStart()这两个方法,当停止Service的时候,则履行onDestroy()方法,这里需要注意的是,如果Service已启动了,当我们再次启动Service时,不会再履行onCreate()方法,而是直接履行onStart()方法。Service的启动有StartService和BindService两种方法,这两种方法对Service生命周期的影响是不1样的。

下面,我们分别来看看这两种方法是如何影响Service生命周期的:

1)  StartService启动Service

用这类方法启动Service,Service会经历 onCreate 然后是onStart,接着1直处于运行状态,直到stopService的时候调用onDestroy方法。如果是调用者自己直接退出而没有调用stopService的话,Service会1直在后台运行。

2)  BindService启动Service

通过这类方法启动Service,Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在1起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。所谓绑定在1起就共存亡了。调用者也能够通过调用unbindService方法来停止服务,这时候候Srevice就会调用onUnbindonUnbind->onDestroyed方法。

4.2.2 Service的启动和停止

我们已对Service的生命周期有了1定的了解,Service的启动方式不同,它的生命周期也不相同。下面,就让我们来看看Service究竟是如何启动和停止的。

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用处合有所不同。

1)使用startService()方法启用服务,调用者与服务之间没有关连,即便调用者退出了,服务依然运行。

    如果打算采取Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用startService()方法前服务已被创建,屡次调用startService()方法其实不会致使屡次创建服务,但会致使屡次调用onStart()方法。

采取startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

2)使用bindService()方法启用服务,调用者与服务绑定在了1起,调用者1旦退出,服务也就终止,大有“不求同生,必须同死”的特点。

onBind()只有采取Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已绑定,屡次调用Context.bindService()方法其实不会致使该方法被屡次调用。

采取Context.bindService()方法启动服务时只能调用onUnbind()方法消除调用者与服务消除,服务结束时会调用onDestroy()方法。

4.2.3 我的服务我来用―本地服务(Localservice)开发

本地服务用于利用程序内部。它可以启动并运行,直到有人停止了它或它自己停止。在这类方式下,它以调用Context.startService()来启动,调用Context.stopService()来停止。它也能够调用Service.stopSelf() 或Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用1次stopService()就能够停止服务。

它用于实现利用程序自己的1些耗时任务,比如查询升级信息,它其实不占用利用程序Activity所属线程,而只是单开线程后台履行,这样用户体验比较好。

有些服务是不需要和Activity交互就可以直接运行的,而有些则是需要与Activity进行交互。下面,我们通过1些例子来加以说明。

--------------------------------------------
试着放个广告 现在没工作 要生存 没办法
平安陆金所 隶属于平安团体的p2p平台
年投资回报率7%-9% 是替换银行理财的首选
个人经验教训 推荐投资安鑫或有担保的彩虹项目
不要投资安e 那个几近没法转让 想提早提现非常困难
注册链接 http://affiliate.lufax.com/action/36XBU
用此链接注册 你我都会有几10元的额外现金嘉奖
--------------------------------------------
 

1)不和Activity交互的本地服务

首先,我们新建1个LocalService类继承自Service,代码以下:

// import略

public class LocalService extends Service{

 

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }

    @Override

    public void onCreate() {

        super.onCreate();

    }

    @Override

    public void onDestroy() {

        super.onDestroy();

    }

    @Override

    public void onStart(Intent intent, int startId) {

        super.onStart(intent, startId);

    }

}

 

然后,新建1个类ServiceActivity继承自Actvity,代码以下:

// import略

public class ServiceActivity extends Activity{

 

private Button startBtn,stopBtn;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.localservice);

        startBtn = (Button)findViewById(R.id.start_button);

        stopBtn = (Button)findViewById(R.id.stop_button);

        startBtn.setOnClickListener(new View.OnClickListener() {

             @Override

             public void onClick(View v) {

                 startService(new Intent("com.char4.LOCAL_SERVICE"));

             }

        });

        stopBtn.setOnClickListener(new View.OnClickListener() {

             @Override

             public void onClick(View v) {

                 stopService(new Intent("com.char4.LOCAL_SERVICE"));

             }

        });

    }

 

}

 

布局文件localservice.xml代码以下,它定义了两个按钮,1个用来启动Service,1个用来停止Service:

<?xml version="1.0" encoding="utf⑻"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="match_parent">

    <Button

        android:id="@+id/start_button"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="启动"/>

    <Button

        android:id="@+id/stop_button"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="停止"/>

</LinearLayout>

 

别忘了,在AndroidMainfest.xml中注册Service:

<service android:name=".LocalService">

<intent-filter>

<action android:name="com.char4.LOCAL_SERVICE " />

<category android:name="android.intent.category.default" />

</intent-filter>

</service>

 

下面,我们来看看效果,如图4⑺所示:

图4⑺ startService启动顺序

 

通过日志打印我们可以发现,第1次点击“启动”按钮时,会调用onCreate和onStart方法,在没有点击“停止”按钮前,不管点击多少次“启动”按钮,都只会调用onStart。而点击“停止”按钮时则调用onDestroy。再次点击 “停止”按钮,会发现不会进入service的生命周期的,即不会再调用onCreate,onStart和onDestroy,而onBind在点击“启动”和“停止”按钮时都没有调用。

 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐