Android的Service了解和两种启动方式

转载 2015年11月21日 20:43:46

【声明】此文转载自:http://liangruijun.blog.51cto.com/3061169/647804/

——尊重作者,知识无价,交流无限!


一.Service的简介

1.Service介绍和作用
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了。
 
2.Service生命周期
Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
 
二.Service的启动方式
Service的有两种启动方式:Context.startService()和Context.bindService(),这两种方式对Service生命周期的影响是不同的。
 
1.Context.startService()方式启动
①Context.startService()方式的生命周期: 
启动时,startService –> onCreate() –> onStart()
停止时,stopService –> onDestroy()
如果调用者直接退出而没有停止Service,则Service 会一直在后台运行
 
Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
 
②Context.startService()方式启动 Service的方法:
MainActivity.java
package com.android.service.activity;  
 
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity  
{  
    private Button startBtn;  
    private Button stopBtn;  
    @Override 
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        startBtn = (Button) findViewById(R.id.startBtn);  
        stopBtn = (Button) findViewById(R.id.stopBtn);  
        //添加监听器  
        startBtn.setOnClickListener(listener);  
        stopBtn.setOnClickListener(listener);  
    }  
      
    //启动监听器  
    private OnClickListener listener=new OnClickListener()  
    {         
        @Override 
        public void onClick(View v)  
        {  
            Intent intent=new Intent(MainActivity.this, ServiceDemo.class);  
            switch (v.getId())  
            {  
            case R.id.startBtn:  
                startService(intent);  
                break;  
            case R.id.stopBtn:  
                stopService(intent);  
                break;  
            default:  
                break;  
            }             
        }  
    };  
} 


ServiceDemo.java

package com.android.service.activity;  
 
import android.app.Service;  
import android.content.Intent;  
import android.os.IBinder;  
import android.util.Log;  
 
public class ServiceDemo extends Service  
{  
    private static final String TAG="Test";  
      
    @Override 
    //Service时被调用  
    public void onCreate()  
    {  
        Log.i(TAG, "Service onCreate--->");  
        super.onCreate();  
    }  
 
    @Override 
    //当调用者使用startService()方法启动Service时,该方法被调用  
    public void onStart(Intent intent, int startId)  
    {  
        Log.i(TAG, "Service onStart--->");  
        super.onStart(intent, startId);  
    }  
 
    @Override 
    //当Service不在使用时调用  
    public void onDestroy()  
    {  
        Log.i(TAG, "Service onDestroy--->");  
        super.onDestroy();  
    }  
 
    @Override 
    //当使用startService()方法启动Service时,方法体内只需写return null  
    public IBinder onBind(Intent intent)  
    {  
        return null;  
    }  
}  


AndroidManifest.xml文件中记得注册服务

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.android.service.activity" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="10" /> 
 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".MainActivity" 
                  android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    <service android:name=".ServiceDemo" >    
             <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
    </service>    
    </application> 
</manifest> 


2.Context.bindService()方式启动:
 
Context.bindService()方式的生命周期: 
绑定时,bindService -> onCreate() –> onBind()
调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()
 
用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
 
②Context.bindService()方式启动 Service的方法:
绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);
第一个:Intent对象
第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接
第三个:如何创建Service,一般指定绑定的时候自动创建

MainActivity.java

package com.android.bindservice.activity;  
 
import android.app.Activity;  
import android.app.Service;  
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.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity {  
    // 声明Button  
    private Button startBtn,stopBtn,bindBtn,unbindBtn;  
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        // 设置当前布局视图  
        setContentView(R.layout.main);  
        // 实例化Button  
        startBtn = (Button)findViewById(R.id.startBtn1);  
        stopBtn = (Button)findViewById(R.id.stopBtn2);  
        bindBtn = (Button)findViewById(R.id.bindBtn3);  
        unbindBtn = (Button)findViewById(R.id.unbindBtn4);  
          
        // 添加监听器  
        startBtn.setOnClickListener(startListener);  
        stopBtn.setOnClickListener(stopListener);  
        bindBtn.setOnClickListener(bindListener);  
        unbindBtn.setOnClickListener(unBindListener);  
          
    }  
    // 启动Service监听器  
    private OnClickListener startListener = new OnClickListener() {  
        @Override 
        public void onClick(View v) {  
            // 创建Intent  
            Intent intent = new Intent();  
            // 设置Class属性  
            intent.setClass(MainActivity.this, BindService.class);  
            // 启动该Service  
            startService(intent);  
        }  
    };  
      
    // 停止Service监听器  
    private OnClickListener stopListener = new OnClickListener() {  
        @Override 
        public void onClick(View v) {  
            // 创建Intent  
            Intent intent = new Intent();  
            // 设置Class属性  
            intent.setClass(MainActivity.this, BindService.class);  
            // 启动该Service  
            stopService(intent);  
        }  
    };  
      
   // 连接对象  
   private ServiceConnection conn = new ServiceConnection() {  
        @Override 
        public void onServiceConnected(ComponentName name, IBinder service) {  
            Log.i("Service", "连接成功!");  
        }  
        @Override 
        public void onServiceDisconnected(ComponentName name) {  
            Log.i("Service", "断开连接!");  
        }  
    };  
      
    // 綁定Service监听器  
    private OnClickListener bindListener = new OnClickListener() {  
        @Override 
        public void onClick(View v) {  
            // 创建Intent  
            Intent intent = new Intent();  
            // 设置Class属性  
            intent.setClass(MainActivity.this, BindService.class);  
           
            // 绑定Service  
            bindService(intent, conn, Service.BIND_AUTO_CREATE);  
        }  
    };  
          
    // 解除绑定Service监听器  
    private OnClickListener unBindListener = new OnClickListener() {  
        @Override 
        public void onClick(View v) {  
            // 创建Intent  
            Intent intent = new Intent();  
            // 设置Class属性  
            intent.setClass(MainActivity.this, BindService.class);  
            // 解除绑定Service  
            unbindService(conn);  
        }  
    };    
} 

BindService.java

package com.android.bindservice.activity;  
 
import android.app.Service;  
import android.content.Intent;  
import android.os.IBinder;  
import android.util.Log;  
 
public class BindService extends Service{  
      
    private static final String TAG="Test";  
      
    //返回null  
    public IBinder onBind(Intent intent) {  
        Log.i(TAG, "Service onBind--->");  
        return null;  
    }  
    // Service创建时调用  
    public void onCreate() {  
        Log.i(TAG, "Service onCreate--->");  
    }  
    // 当客户端调用startService()方法启动Service时,该方法被调用  
    public void onStart(Intent intent, int startId) {  
        Log.i(TAG, "Service onStart--->");  
    }  
    // 当Service不再使用时调用  
    public void onDestroy() {  
        Log.i(TAG, "Service onDestroy--->");  
    }  
    // 当解除绑定时调用  
    public boolean onUnbind(Intent intent) {    
        Log.i(TAG, "Service onUnbind--->");    
        return super.onUnbind(intent);    
    }    
}  

提醒:记得清单文件进行注册

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处☞指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

相关文章推荐

Android Service两种启动方式

1.Context.startService()方式启动  ①Context.startService()方式的生命周期: 启动时,startService –> onCreate() –> onS...

Android四大组件Service之两种的多线程启动方式

由于Service常常用于处理比较耗时的后台服务,在不适用多线程时,所有的组件服务都是在主线程中执行的,必然会影响用户体验和整体性能,下面是两种启动Service线程的方式。 第一种方法:在Ser...

Android Service 两种启动方式的区别

最近在debug android service destory的bug,网上找了service相关的知识,startservice和bindservice都可以启动service,知道这两种方式的区...

android service的两种启动方式

package com.liang.myservice; import android.app.Service; import android.content.Intent; import andro...

Android Service的两种启动方式以及生命周期

Android Service的两种启动方式以及生命周期

Android Service两种启动方式详解(总结版)

Service生命周期.png 第一种方式:通过StartService启动Service 通过startService启动后,service会一直无限期运行下去,只有外部调用了stopServic...

Android Service 两种启动方式的区别

最近在debug android service destory的bug,网上找了service相关的知识,startservice和bindservice都可以启动service,知道这两种方式的区...

Android中,关于service的启动两种方式描述不正确的是

碰到群友问的一个问题,说:关于service的启动两种方式描述不正确的是(如图)? 当时看到这个问题有点纠结,纠结内容如下: A 选项没有疑问,官网就是这么说的 B选项就是我所纠结的地方,这个调用者如...

Android Service的两种启动方式

Android中有一个经常使用到的组件,叫Service,它有这么几个特点: 它无法与用户直接进行交互; 它必须由用户或者其他程序显式的启动; 它的优先级比较高,它比处于前台的应用优先级低,但是比后...

Android Service两种启动方式

1.Context.startService()方式启动  ①Context.startService()方式的生命周期: 启动时,startService –> onCreate() –> onS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的Service了解和两种启动方式
举报原因:
原因补充:

(最多只允许输入30个字)