Android bindService的使用与Service生命周期案例详解

Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService相关的使用,请参见《Android中startService的使用及Service生命周期》。

bindService启动服务的特点

相比于用startService启动的Service,bindService启动的服务具有如下特点:
1. bindService启动的服务在调用者和服务之间是典型的client-server的接口,即调用者是客户端,service是服务端,service就一个,但是连接绑定到service上面的客户端client可以是一个或多个。这里特别要说明的是,这里所提到的client指的是组件,比如某个Activity。
2. 客户端client(即调用bindService的一方,比如某个Activity)可以通过IBinder接口获取Service的实例,从而可以实现在client端直接调用Service中的方法以实现灵活的交互,并且可借助IBinder实现跨进程的client-server的交互,这在纯startService启动的Service中是无法实现的。
3. 不同于startService启动的服务默认无限期执行(可以通过Context的stopService或Service的stopSelf方法停止运行),bindService启动的服务的生命周期与其绑定的client息息相关。当client销毁的时候,client会自动与Service解除绑定,当然client也可以通过明确调用Context的unbindService方法与Service解除绑定。当没有任何client与Service绑定的时候,Service会自行销毁(通过startService启动的除外)。
4. startService和bindService二者执行的回调方法不同:startService启动的服务会涉及Service的的onStartCommand回调方法,而通过bindService启动的服务会涉及Service的onBind、onUnbind等回调方法。

bindService代码示例

使用bindService主要分两种情形:
1. Service的调用者client与Service在同一个App中;
2. Service的调用者client是App1中的一个Activity,而Service是App2中的Service,client与service分属两个App,这种情形下主要用于实现跨进程的通信。

为了简单起见,本文只讨论第一种情形,即Service的调用者client与Service在同一个App中,该情形也是我们在实际开发中用到最多的情形。如果想了解通过bindService在两个不同的进程中让客户端与Service通信,可参见另一篇博文《Android中通过Messenger与Service实现进程间双向通信》。

下面我们通过一个例子演示一下第一种情形下bindService的基本使用流程。

首先我们有一个TestService,该类继承自Service,其是client-server接口中的server端。我们在其主要的生命周期回调方法中都加入了输出语句。TestService代码如下:

package com.ispring.startservicedemo;

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

import java.util.Random;

public class TestService extends Service {

    public class MyBinder extends Binder{

        public TestService getService(){
            return TestService.this;
        }

    }

    //通过binder实现调用者client与Service之间的通信
    private MyBinder binder = new MyBinder();

    private final Random generator = new Random();

    @Override
    public void onCreate() {
        Log.i("DemoLog","TestService -> onCreate, Thread: " + Thread.currentThread().getName());
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("DemoLog", "TestService -> onStartCommand, startId: " + startId + ", Thread: " + Thread.currentThread().getName());
        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("DemoLog", "TestService -> onBind, Thread: " + Thread.currentThread().getName());
        return binder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("DemoLog", "TestService -> onUnbind, from:" + intent.getStringExtra("from"));
        return false;
    }

    @Override
    public void onDestroy() {
        Log.i("DemoLog", "TestService -> onDestroy, Thread: " + Thread.currentThread().getName());
        super.onDestroy();
    }

    //getRandomNumber是Service暴露出去供client调用的公共方法
    public int getRandomNumber(){
        return generator.nextInt();
    }
}

在该App中,除了TestService,还有两个Activity: ActivityA和ActivityB,它们都是Service的调用者,即client-server接口中的client。

ActivityA是App的启动界面,界面如下:

ActivityA的代码如下:

package com.ispring.startservicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class ActivityA extends Activity implements Button.OnClickListener {

    private TestService service = null;

    private boolean isBound = false;

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            isBound = true;
            TestService.MyBinder myBinder = (TestService.MyBinder)binder;
            service = myBinder.getService();
            Log.i("DemoLog", "ActivityA onServiceConnected");
            int num = service.getRandomNumber();
            Log.i("DemoLog", "ActivityA 中调用 TestService的getRandomNumber方法, 结果: " + num);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBound = false;
            Log.i("DemoLog", "ActivityA onServiceDisconnected");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        Log.i("DemoLog", "ActivityA -> onCreate, Thread: " + Thread.currentThread().getName());
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btnBindService){
            //单击了“bindService”按钮
            Intent intent = new Intent(this, TestService.class);
            intent.putExtra("from", "ActivityA");
            Log.i("DemoLog", "-------------------------------------------------------------");
            Log.i("DemoLog", "ActivityA 执行 bindService");
            bindService(intent, conn, BIND_AUTO_CREATE);
        }else if(v.getId() == R.id.btnUnbindService){
            //单击了“unbindService”按钮
            if(isBound){
                Log.i("DemoLog", "-------------------------------------------------------------");
                Log.i("DemoLog", "ActivityA 执行 unbindService");
                unbindService(conn);
            }
        }else if(v.getId() == R.id.btnStartActivityB){
            //单击了“start ActivityB”按钮
            Intent intent = new Intent(this, ActivityB.class);
            Log.i("DemoLog", "-------------------------------------------------------------");
            Log.i("DemoLog", "ActivityA 启动 ActivityB");
            startActivity(intent);
        }else if(v.getId() == R.id.btnFinish){
            //单击了“Finish”按钮
            Log.i("DemoLog", "-------------------------------------------------------------");
            Log.i("DemoLog", "ActivityA 执行 finish");
            this.finish();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("DemoLog", "ActivityA -> onDestroy");
    }
}

通过单击ActivityA上的“start ActivityB”可以启动ActivityB,ActivityB的界面如下:

ActivityB的代码如下:

package com.ispring.startservicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class ActivityB extends Activity implements Button.OnClickListener {

    private TestService service = null;

    private boolean isBound = false;

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            isBound = true;
            TestService.MyBinder myBinder = (TestService.MyBinder)binder;
            service = myBinder.getService();
            Log.i("DemoLog", "ActivityB onServiceConnected");
            int num = service.getRandomNumber();
            Log.i("DemoLog", "ActivityB 中调用 TestService的getRandomNumber方法, 结果: " + num);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBound = false;
            Log.i("DemoLog", "ActivityB onServiceDisconnected");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.btnBindService){
            Intent intent = new Intent(this, TestService.class);
            intent.putExtra("from", "ActivityB");
            Log.i("DemoLog", "----------------------------------------------------------------------");
            Log.i("DemoLog", "ActivityB 执行 bindService");
            bindService(intent, conn, BIND_AUTO_CREATE);
        }else if(v.getId() == R.id.btnUnbindService){
            if(isBound){
                Log.i("DemoLog", "----------------------------------------------------------------------");
                Log.i("DemoLog", "ActivityB 执行 unbindService");
                unbindService(conn);
            }
        }else if(v.getId() == R.id.btnFinish){
            //单击了“Finish”按钮
            Log.i("DemoLog", "----------------------------------------------------------------------");
            Log.i("DemoLog", "ActivityB 执行 finish");
            this.finish();
        }
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.i("DemoLog", "ActivityB -> onDestroy");
    }
}

我们暂时不点击上面的按钮,先看一下TestService和ActivityA的代码。

调用者(客户端client)要想和Service进行交互,那么Service和调用者必须都要做好准备。

我们先看Service要做的工作。
使用bindService将client与server联系在一起的关键是binder,在TestService中,我们在其中写了一个内部类MyBinder,该类有个公共方法getService,通过该方法我们可以获取包含MyBinder的TestService。如果想要自己的Service支持bindService启动方式,就必须在Service的onBind中返回一个IBinder类型的实例。在示例中,我们实例化了一个MyBinder的实例binder作为TestService的字段,并且将其作为onBind的返回值。
我们总结一下如果想让Service支持bindService调用方式,Service需要做以下事情:
1. 在Service的onBind方法中返回IBinder类型的实例。
2. onBind方法返回的IBinder的实例需要能够返回Service实例本身或者通过binder暴露出Service公共方法。通常情况下,最简单明了的做法就是将binder弄成Service的内部类,然后在binder中加入类似于getService之类的方法返回包含binder的Service,这样client可以通过该方法得到Service实例。

我们已经知道了Service需要做的事情,我们接下来看一下调用者需要做的工作。
在我们的示例中,调用者(也就是客户端client)是ActivityA,我们在其中初始化了一个ServiceConnection类型的实例,需要重写其onServiceConnected方法以及onServiceDisconnected方法。我们需要将这个ServiceConnection类型的实例作为参数传给bindService方法,当Service还没有创建的时候,Android会先创建Service的实例,然后执行Service的onBind方法,得到IBinder类型的实例,将该方法作为参数传入client端的ServiceConnection的onServiceConnected方法中,onServiceConnected方法的执行表明client端可以获取到Service的IBinder类型的实例,然后将IBinder转换为自己实际的Binder类型,然后可以通过其直接获取Service的实例或者通过Binder直接执行公共方法,这取决于Service中Binder的具体实现。在本例中,在onServiceConnected方法中,调用者ActivityA通过binder的getService方法获取到了与其对应的Service,然后我们就可以直接调用Service的公共方法以达到使用Service的目的,这样client与Service之间就通过IBinder建立了连接,从而进行交互。当client与Service失去连接时会触发onServiceDisconnected方法。
我们总结一下client端要做的事情:
1. 创建ServiceConnection类型的实例,并重写其onServiceConnected方法和onServiceDisconnected方法。
2. 当Android执行onServiceConnected回调方法时,我们可以通过IBinder实例得到Service的实例对象或直接调用binder的公共方法,这样就实现了client与Service的连接。
3. 当Android执行onServiceDisconnected回调方法时,表示client与Service之间断开了连接,我们在此处要写一些断开连接后需要做的处理。

在知道了如何让client与Service进行交互之后,我们运行我们的App,观察各个回调方法的执行过程,我们有三个测试流程。

测试流程A

该测试涉及到ActivityA,但不涉及ActivityB.
首先我们点击ActivityA中的“bindService”按钮,然后点击”unbindService”按钮,输出结果如下所示:

首先,通过上面的代码我们可以看到Service中执行的回调方法都是执行在主线程中的。
当我们调用bindService方法时,我们需要将Intent、ServiceConnection等实例传入,Intent包含了我们要绑定的Service,ServiceConnection我们在上面提到过,实现了其onServiceConnected方法和onServiceDisconnected方法。 在调用了bindService之后,由于Service此时还不存在,那么Android就会首先创建一个TestService的实例,并执行其onCreate回调方法,onCreate方法在其生命周期中只会被调用一次。然后会调用Service的onBind方法,该方法只有在第一次bindService调用后才会执行,onBind执行后会返回一个IBinder类型的实例,此时Android会将该IBinder实例存起来,这个IBinder实例是对所有client共享的。当下次其他的client执行bindService的时候,不会再执行onBind方法,因为我们之前已经得到了一个IBinder实例,Android会直接使用这个IBinder实例。 在得到了IBinder实例之后,Android会执行client端ServiceConnection中的onServiceConnected方法,在该方法中我们会得到IBinder实例,并通过该IBinder实例得到了TestService实例,这样我们的客户端ActivityA就通过IBinder与TestService建立了连接,我们就可以调用TestService的公共方法,比如调用其getRandomNumber方法获得随机数。

总结一下调用bindService之后发生的事情:
client 执行 bindService ->
如果Service不存在,Service 执行 onCreate ->
如果没有执行过onBind,Service 执行 onBind ->
client的实例ServiceConnection 执行 onServiceConnected

在执行了bindService之后,一共有一个client连接到了TestService,即ActivityA,每次client在调用了unbindService方法之后,该client会与Service解除绑定,在与某个client解除绑定之后,Service会检测是否还有其他的client与其连接绑定,如果没有其他任何client与其处于连接状态,那么Service会执行onUnbind方法,然后执行onDestroy方法,最终销毁自己。当ActivityA执行unbindService的时候,唯一的一个client与TestService解除了绑定的关系,TestService就执行了onUnbind方法,进而执行onDestroy方法。

总结一下调用unbindService之后发生的事情:
client 执行 unbindService ->
client 与 Service 解除绑定连接状态 ->
Service 检测是否还有其他client与其连接,如果没有 ->
Service 执行onUnbind ->
Service 执行onDestroy

测试流程B

我们在测试完第一种流程后,关掉App,重启App,进行第二种测试流程。
该测试也只涉及ActivityA,不涉及ActivityB。首先先点击ActivityA中的“bindService”按钮,然后点击”Finish”按钮,输出结果如下图所示:

在该测试中,我们首先通过点击”bindService”按钮,使得ActivityA绑定了TestService,但是我们没有调用unbindService,而是直接通过调用“Finish”按钮让ActivityA直接销毁,通过上面的输出结果我们可以看到,在ActivityA销毁的时候,执行了ActivityA的onDestroy回调方法,之后TestService依次执行了onUnbind、onDestroy回调方法,TestService销毁。client与Service通过bindService连接起来之后,如果client销毁,那么client会自动与Service解除绑定,相当于在destroy之前会执行unbindService,在ActivityA销毁之后,ActivityA与Service解除了绑定,此时再没有client与Service处于连接绑定状态,这样Service就会执行onUnbind回调方法,表示没有client和我玩了,最后执行onDestroy回调方法。

测试流程C

我们在之前的两次测试流程中都只涉及ActivtityA,本测试流程会同时涉及ActivityA以及ActivityB。
首先关掉App,重启App,按照以下步骤测试:
1. 点击ActivityA中的”bindService”按钮
2. 点击ActivityA中的”start ActivityB”按钮,界面切换到ActivityB
3. 点击ActivityB中的”bindService”按钮
4. 点击ActivityB中的”unbindService”按钮
5. 点击ActivityB中的”Finish”按钮
6. 点击ActivityA中的”unbindService”按钮

LogCat输出结果如下:

下面我们依次分析每一步产生的影响,以便于完整地理解通过bindService启动的Service的生命周期:

  • 点击ActivityA中的”bindService”按钮
    由于初始情况下TestService实例不存在,也就是TestService没有运行。第一次调用bindService会实例化TestService,然后会执行其onBind方法,得到IBinder类型的实例,然后将其作为参数传入ActivityA的ServiceConnection的onServiceConnected方法中,标志着ActivityA与TestService建立了绑定连接,此时只有ActivityA这一个客户端client与TestService绑定。
  • 点击ActivityA中的”start ActivityB”按钮,界面切换到ActivityB
  • 点击ActivityB中的”bindService”按钮
    由于TestService已经处于运行状态,所以ActivityB调用bindService时,不会重新创建TestService的实例,所以也不会执行TestService的onCreate回调方法,由于在ActivityA执行bindService的时候就已经执行了TestService的onBind回调方法而获取IBinder实例,并且该IBinder实例在所有的client之间是共享的,所以当ActivityB执行bindService的时候,不会执行其onBind回调方法,而是直接获取上次已经获取到的IBinder实例。并将其作为参数传入ActivityB的ServiceConnection的onServiceConnected方法中,标志着ActivityB与TestService建立了绑定连接,此时有两个客户单client(ActivityA和ActivityB)与TestService绑定。
  • 点击ActivityB中的”unbindService”按钮
    ActivityB执行了unbindService之后,ActivityB就与TestService解除了绑定。当没有任何client与Service处于绑定连接状态的时候,TestService才会执行onUnbind方法、onDestroy方法。但是由于此时还有ActivityA这个client与TestService处于绑定连接中,所以不会执行Service的onBind及onDestroy回调方法。
  • 点击ActivityB中的”Finish”按钮
    执行了ActivityB的finish方法后,ActivityB销毁了,界面返回到ActivityA
  • 点击ActivityA中的”unbindService”按钮
    ActivityA执行unbindService之后,ActivityA与TestService就解除绑定了,这样就没有客户端client与TestService相连,这时候Android会销毁TestService,在销毁前会先执行TestService的onUnbind方法,然后才会执行其onDestroy方法,这样TestService就销毁了。

bindService生命周期流程图

这里特别要说明的是,本文所提到的client指的是组件Component,比如某个Activity。如果在某一个Activity中,多次调用bindService方法连接Service,那么对于Service来说,这个Activity也只是一个client,而不是多个client。

最后我们将bindService启动的Service的生命周期总结为如下的流程图:

希望本文对大家了解bindService的使用有所帮助。

到此这篇关于Android bindService的使用与Service生命周期案例详解的文章就介绍到这了,更多相关Android bindService的使用与Service生命周期内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android BindService使用案例讲解

    最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现. BindService和Started Service都是Service,有什么地方不一样呢: 1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行[onCreate()-  >onStartCommand()->startService()->onDes

  • Android bindservice失败解决方法

    Android bindservice失败解决方法 现象: this.bindService(bindIntent, conn, Context.BIND_AUTO_CREATE); 相同的代码以前使用一直很正常,但最近在项目中使用却一直绑定失败,bindservice返回false. 原因: 使用了TabActivity, TabActivity里的子Activity调用this.bindservice,导致失败.该问题属于Google Android的缺陷,由于TabActivity已经被弃

  • Android中bindService基本使用方法概述

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService基本使用方法概述>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务具有如下特点:

  • Android 启动 Service(startservice和bindservice) 两种方式的区别

    Android Service 生命周期可以促使移动设备的创新,让用户体验到最优越的移动服务,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive()返回的时候,它就是非激活状态. 如果没有程序停止它或者它自己停止,service将一直运行.在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Android Service 生命周期() 或 Se

  • Android bindService的使用与Service生命周期案例详解

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService的使用及Service生命周期>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务

  • Android编程中activity的完整生命周期实例详解

    本文实例分析了Android编程中activity的完整生命周期.分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误.这篇文章很长,希望不要耽误大家的时间- 今天不会涉及太多关于activity栈的东西,主要说activity自身的生命周期 区分几个概念 1 Activity 官方解释为 "An Activity is an application component that pro

  • Java线程的生命周期的详解

    Java线程的生命周期的详解 对于多线程编程而言,理解线程的生命周期非常重要,本文就针对这一点进行讲解. 一.线程的状态 线程的存在有几种不同的状态,如下: New状态 Ready状态 Running状态 Dead状态 Non Runnable状态 1.New状态 New状态是线程已经被创建,但是还未开始运行的状态.此状态通过调用线程的start()方法可让线程运行. 2.Runnable状态 Runnable状态可称为准备运行状态,也可称为队列,此状态通过调用线程的start()方法可让线程运

  • Vue生命周期区别详解

    生命周期分类 vue每个组件都是独立的,每个组件都有一个属于它的生命周期, 从一个组件创建.数据初始化.挂载.更新.销毁,这就是一个组件所谓的生命周期. 在组件中具体的方法有: beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyed beforeCreate( 创建前 ) 在实例初始化之后,数据观测和事件配置之前被调用,此时组件的选项对象还未创建,el 和 data 并未初始化,因

  • 微信APP生命周期及页面生命周期示例详解

    目录 官方文档 小程序的启动流程 app生命周期 页面的生命周期 页面的生命周期(图) 官方文档 https://developers.weixin.qq.com/doc/search.html?query=生命周期&doc_type=miniprogram&jumpbackUrl=%2Fdoc%2F 小程序的启动流程 我们画一个图来表示一下,整个小程序的启动流程,我们就知道了: app生命周期 执行App()函数也就是注册一个App 1 在注册app的时候,可以判断小程序的进入场景 2

  • Vue生命周期函数调用详解

    目录 生命周期 Vue.mixin 生命周期选项合并 调用生命周期函数 结语 生命周期 Vue为用户提供了许多生命周期钩子函数,可以让用户在组件运行的不同阶段书写自己的逻辑. 那么Vue内部到底是如何处理生命周期函数的呢?Vue的生命周期究竟是在代码运行的哪个阶段执行呢?本文将实现Vue生命周期相关代码的核心逻辑,从源码层面来理解生命周期. Vue.mixin 在介绍生命周期之前,我们先来看下Vue.mixin. Vue.mixin是Vue的全局混合器,它影响Vue创建的每一个实例,会将mixi

  • Rust指南之生命周期机制详解

    目录 前言 1.所有权中的垂悬引用解析 2.结构体中使用String 而不用&str 的原因 3.生命周期注释 4.结构体中使用字符串切片引用 5.静态生命周期 6.泛型.特性与生命周期综合使用 前言   Rust 生命周期机制是与所有权机制同等重要的资源管理机制,之所以引入这个概念主要是应对复杂类型系统中资源管理的问题.引用是对待复杂类型时必不可少的机制,毕竟在Rust 中复杂类型的数据不能被处理器轻易地复制和计算.但是为什么还有引入生命周期的概念呢,这是因为引用常常会导致非常复杂的资源管理问

  • Android 通过自定义view实现水波纹效果案例详解

    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢: 好了,为了让大家都能给妹纸们想要的,后面会逐渐分享一些比较比较不错的效果,目的只有一个,通过自定义view实现我们所能实现的动效: 今天主要分享水波纹效果: 标准正余弦水波纹: 非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余

  • Android编程之基于Log演示一个activity生命周期实例详解

    本文实例讲述了Android编程之基于Log演示一个activity生命周期.分享给大家供大家参考,具体如下: 利用Android的Log 演示一个activity的生命周期 代码: //DemoActivity.java package uni.activity; /* @author octobershiner 2011 7 22 SE.HIT */ import android.app.Activity; import android.os.Bundle; import android.u

  • 两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)

    大家好,今天给大家详解一下Android中Activity的生命周期,我在前面也曾经讲过这方面的内容,但是像网上大多数文章一样,基本都是翻译Android API,过于笼统,相信大家看了,会有一点点的帮助 ,但是还不能完全吃透,所以我今天特意在重新总结一下.首先看一下Android api中所提供的Activity生命周期图(不明白的,可以看完整篇文章,在回头看一下这个图,你会明白的): Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码: 复

随机推荐