zoukankan      html  css  js  c++  java
  • 服务的生命周期

    service:服务  是运行后台,他是没有界面的。对某件事情进行监听。服务他是不能自己运行,必须手动激活。


    以下开始介绍启动服务的两种方式:

    一、启动服务的两种方式

    1、startService(intent)

       生命周期:onCreate() ------>>onStart()-------->>onDestroy()

       解释:

       1) onCreate()  只会被调用一次   , onStart()   只要启动就会多次调用 ,onDestory()  只会被调用一次

       2)startService()是会调用onCreate() ------>>onStart()。stopService()时会调用onDestroy()

       3)用startService()的方式去启动服务,就必须使用stopService()的方式去停止服务

       4)访问者与服务之间 没有关联关系。如Activity退出后,Service依然可以正常工作...


    2、bindService(intent,conn,BIND_AUTO_CREATE)

        生命周期:onCreate()--------->>onBind()----------->>onUnbind()----------->>onDestroy()

         解释:

         1)onCreate()只会被调用一次,onBind()只会被调用一次,onUnbind()只会被调用一次,onDestroy()只会被调用一次

         2)bindService(intent,conn,BIND_AUTO_CREATE)绑定服务时,调用onCreate()--------->>onBind()。unBindService()解除绑定时会调用onUnbind()----------->>onDestroy()

         3)一般情况下,使用bindService()去绑定服务,就只能使用unbindService()取解除绑定.可以多次绑定,但是解绑服务只能执行一次,多次解绑就会出错。

         4)访问者与服务之间有关联关系。如Activity退出后(如果还没有解除绑定),Service不会继续工作了。

    其过程为:抛出一个异常,然后自动执行unbindService()(unbindService()方法会自动去执行onUnbind() 方法);

      抛出的异常如下:

    Activity com.njupt.service.MainActivity has leaked ServiceConnection com.njupt.service.MainActivity$MyServiceConnection@43e76590 that was originally bound here


    所以如果访问者(如Activity)退出,需要把连接释放。 即在Activity的onDestroy()方法中加上以下代码:

    @Override
    	protected void onDestroy() {
    		super.onDestroy();
    		
    		if(conn != null){
    			unbindService(conn);
    		}
    	}



    **************需要注意的是,上面所提到的onCreate()、onStart()、onBind()、onUnbind()、onDestroy()都指的是Service组件中的方法,而不是Activity组件中的方法。这里要区分开来,别搞混了。。。。。


    二、Activity中的几个方法与Service组件中的几个方法的联系

                   Activity                                              Service

                startService(intent)    ---(调用)----->     onCreate() 、onStart()

                stopService()            ---(调用)----->      onDestroy()

                bindService()            ---(调用)----->      onCreate()、onBind()

                unbindService()        ---(调用)----->      onUnbind()、onDestroy()


       

    代码如下:

    1、main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="启动服务"
            android:onClick="startservice"
            />
        
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="停止服务"
            android:onClick="stopservice"
            />
        
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="绑定服务"
            android:onClick="bindservice"
            />
        
        <Button 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解绑服务"
            android:onClick="unbindservice"
            />
    
    </LinearLayout>
    


    2、MainActivity

    package com.njupt.service;
    
    import android.os.Bundle;
    import android.os.IBinder;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
    	private MyServiceConnection conn;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    	}
    
    	public void startservice(View v){
    		Intent intent = new Intent(this,MyService.class);
    		startService(intent);
    	}
    	
    	public void stopservice(View v){
    		Intent intent = new Intent(this,MyService.class);
    		stopService(intent);
    	}
    	
    	public void bindservice(View v){
    		Intent intent = new Intent(this,MyService.class);
    		conn = new MyServiceConnection();
    		bindService(intent, conn, BIND_AUTO_CREATE);
    	}
    	
    	private class MyServiceConnection implements ServiceConnection{
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    			
    		}
    		
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			
    		}
    	}
    	
    	public void unbindservice(View v){
    		
    		unbindService(conn);
    		conn = null;
    	}
    	
    	
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		
    		if(conn != null){
    			unbindService(conn);
    		}
    	}
    }
    


    3、MyService

    package com.njupt.service;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class MyService extends Service {
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    	    
    		System.out.println("onCreate调用");
    	}
    	
    	@Override
    	public void onStart(Intent intent, int startId) {
    		super.onStart(intent, startId);
           
    		System.out.println("onStart调用");
    	}
    	
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    		
    		System.out.println("onDestroy调用");
    	}
    	
    	
    	@Override
    	public IBinder onBind(Intent intent) {
    		
    		System.out.println("onBind调用");
    		return null;
    	}
    	
    	@Override
    	public boolean onUnbind(Intent intent) {
    		System.out.println("onUnbind调用");
    		return super.onUnbind(intent);
    	}
    
    }
    



    4、AndroidManfest.xml

    注册Service组件

    <service android:name="com.njupt.service.MyService"/>




  • 相关阅读:
    配置linux 防火墙,只有固定IP和端口才能能访问完美解决
    转.HTML中img标签的src属性绝对路径问题解决办法,完全解决!
    weblogic 安全漏洞问题解决
    转 echarts 的使用时遇到的坑 初始化和销毁,亲测有效!
    在使用 Fortify进行源码扫描时需要做对项目需要做什么?
    eclipse 导出 jar包详细步骤
    转 Fortofy扫描漏洞解决方案2
    JSON 之 SuperObject(1)
    Delphi使用JSON解析调用淘宝IP地址库REST API 示例
    Jsoncpp的使用
  • 原文地址:https://www.cnblogs.com/riskyer/p/3324878.html
Copyright © 2011-2022 走看看