Android Service 生命周期

摘要:
服务概念和目的:Android中的服务不同于活动,不能与用户交互,不能启动自己,并且在后台运行。如果我们退出应用程序时服务进程没有结束,并且它仍然在后台运行,我们什么时候使用服务?服务和活动通信:服务后端的数据最终将显示在前端活动上,因为当服务启动时,系统将重新启动一个新进程,这涉及不同进程之间的通信。当我们想要获得启动的服务实例时,我们可以使用bindService和unBindService方法,它们分别在服务中执行onBind()和onUnbind()方法。

Service概念及用途:

Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以用Service在后台定时更新,而不用每打开应用的时候在去获取。

Service生命周期:

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。

Service与Activity通信:

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),当我们想获取启动的Service实例时,我们可以用到bindService和unBindService方法,它们分别执行了Service中onBind()和onUnbind()方法。

1、添加一个类,在MainActivity所在包之下,继承自Service

2、在程序界面文件中添加控件

3、修改MainActivity中的方法,以及让MainActivity类实现OnClickListener接口

public class MainActivity extends Activity implementsOnClickListener {
    privateLService mLService;
    privateTextView mTextView;
    privateButton startServiceButton;
    privateButton stopServiceButton;
    privateButton bindServiceButton;
    privateButton unbindServiceButton;
    privateContext mContext;
    // 这里需要用到ServiceConnection,在Context.bindService和context.unBindService()里用到
    private ServiceConnection mServiceConnection = newServiceConnection() {
        // 当bindService时,让TextView显示LService里getSystemTime()方法的返回值
@Override
        public voidonServiceConnected(ComponentName name, IBinder service) {
            mLService =((LService.LBinder) service).getService();
            mTextView.setText("I am from Service :" +mLService.getSystemTime());
        }
        public voidonServiceDisconnected(ComponentName name) {
        }
    };
    public voidsetupViews() {
        mContext = MainActivity.this;
        mTextView =(TextView) findViewById(R.id.text);

        startServiceButton =(Button) findViewById(R.id.startservice);
        stopServiceButton =(Button) findViewById(R.id.stopservice);
        bindServiceButton =(Button) findViewById(R.id.bindservice);
        unbindServiceButton =(Button) findViewById(R.id.unbindservice);

        startServiceButton.setOnClickListener(this);
        stopServiceButton.setOnClickListener(this);
        bindServiceButton.setOnClickListener(this);
        unbindServiceButton.setOnClickListener(this);
    }
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupViews();
    }
}

4、注册Service

<service
  android:name=".LService"
  android:exported="true" >
</service>

startService:onCreate()->onStart()此时调用程序设置里面可以看到Running Service有一个LService

stopService:onDestory()

bindService:onCreate()->onBind();此时Service已经被关闭

unbindService:onunBind->onDestory()

startService->bindService->unbindService:onCreate()->onStart()->onBind()->onunBind->onDestory();

当采用Context.startService()方法启动服务,与之有关的生命周期方法:onCreate()->onStart()->onDestory()

1>onCreate()方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或者bindService()方法,服务也只被创建一次;
onStart()方法只有采用Context.startService()方法启动服务时才会被调用,该方法在服务开始运行时被调用,多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。

2>onDestory()方法在服务被终止时被调用;
当采用Context.bindService方法启动服务,与之有关的生命周期方法:onCreate()->onBind()->onUnbind()->onDestory()

3>onBind()只有采用Context.bindService()方法启动服务时才会被调用,该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

4>onUnbind()只有采用Context.unbindService()方法启动服务时才会回调该方法,该方法在调用者与服务解绑定时被调用;

5>如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法为:onCreate()->onStart()->onBind()->onUnBind()[重载后的方法需返回true]->onRebind();

6>服务不能自己运行,需要通过调用Context.startService()或者Context.bindService()方法启动服务。这两个方法都可能启动服务,但是它们使用场合不同,使用startService()方法启动服务,访问者与服务没有关连,即使访问者退出了,服务仍然运行,使用bindService()方法启动服务,访问者与服务绑定在一起,访问者一旦,服务也就终止,使用Context.startService()启动服务,只能调用 Context.stopService()结束服务,服务结束时会调用onDestory()方法;

通过startService()和stopService()启动关闭服务,适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要使用bindService()和unbindService()方法启动关闭服务;

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,此时访问者与服务绑定,如果要进行通信,onBind()方法需要返回一个Ibinder对象。如果访问者退出,系统先调用onUnbind()方法,再调用onDestory()方法。访问者与服务解除绑定可以通过unbindService()方法解绑。onUnbind()->onDestory()!

一个监听电话的实例

public class PhoneService extendsService {
    @Override
    publicIBinder onBind(Intent intent) {
        return null;
    }
    privateMediaRecorder recorder;
    private File file = null;
    @Override
    public voidonCreate() {
        TelephonyManager manger =(TelephonyManager) 
          getSystemService(Context.TELEPHONY_SERVICE);//内置的服务,通过getSystemService获取
        manger.listen(newPhoneStateListener() {
            @Override
            public void onCallStateChanged(intstate, String incomingNumber) {
                switch(state) {
                case TelephonyManager.CALL_STATE_RINGING:// 来电
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:// 接通电话
                    file = newFile(Environment.getExternalStorageDirectory(),
                            incomingNumber +System.currentTimeMillis());
                    recorder = newMediaRecorder();
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 声音来源
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 保存的声音类型
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 编码方式
                    try{
                        recorder.prepare();// 准备
                        recorder.start();// 开始录音
                    } catch(IOException e) {
                    }
                    break;
                case TelephonyManager.CALL_STATE_IDLE:// 挂断电话后回归到空闲状态
                    if (recorder != null) {
                        recorder.stop();// 停止
                        recorder.release();// 释放
                        recorder = null;
                        uploadfile();
                    }
                    break;
                }
            }
        }, PhoneStateListener.LISTEN_CALL_STATE);
    }
    protected voiduploadfile() {
        new Thread(newRunnable() {
            @Override
            public voidrun() {
                if (file != null &&file.exists()) {
                    file.delete();
                    file = null;
                }
            }
        }).start();
    }
}

Android Service 生命周期第1张

获取正在运行的Service

public class ServiceList extendsActivity {
    @Override
    protected voidonCreate(Bundle savedInstanceState) {ActivityManager activityManger = (ActivityManager) getSystemService(ACTIVITY_SERVICE);// 获取Activity管理器
        List<ActivityManager.RunningServiceInfo> serviceList = activityManger.getRunningServices(30);// 从窗口管理器中获取正在运行的Service}
    private boolean ServiceIsStart(List<ActivityManager.RunningServiceInfo> list, String className) {// 判断某个服务是否启动
        for (int i = 0; i < list.size(); i++) {
            if(className.equals(list.get(i).service.getClassName()))
                return true;
        }
        return false;
    }
    private String getServicesName(List<ActivityManager.RunningServiceInfo> list) {// 获取所有服务的名称
        String res = "";
        for (int i = 0; i < list.size(); i++) {
            res += list.get(i).service.getClassName() + "/n";
        }
        returnres;
    }
}

免责声明:文章转载自《Android Service 生命周期》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇五 数据组织模式 (重组数据) 1 分层结构模式[翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Service的生命周期

Service启动的方式1 start: Activity.startService(intent); 开启 Activity.stopService(intent); 停止 Service的运行的生命周期为: onCreate(); onStartCommand(); onDestroy(); 如果Service已经启动 则不会再调用onCreate()...

Android Service总结02 service介绍

Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容。 2013-03-16 Skywang         概要   若读者之前没接触过service,对下面内容有个大致了解即可。待使用过service之后再来阅读本章内容,会理解...