service

1、service是Android四大组件之一

2、service本质上是后台运行的可执行程序,它没有Activity那样的用户界面。

3、service通常不与用户交互,不能自己启动,运行在后台。

4、service主要用于长时间的后台服务,以及周期性的后台监控。

  一、播放媒体时,启动其他Activity,此时程序要在后台继续播放。

  二、检测sd卡上的文件变化。

  三、后台记录手机当前地理信息位置的改变

  四、后台完成大文件下载

5、service具有更高的进程优先级,五个级别中,位于第三个级别。

6、service具有全局唯一性。同一时间系统只能存在service一个实例。

7、service必须在项目清单中注册才能使用。

8、service分为系统服务和应用服务。

  一:系统服务,Android提供大量的系统service,如媒体播放服务。

  二:应用服务,开发者自定义服务。

下面介绍下service生命周期:

创建一个service很简单,我们在页面上建两个按钮:

当点击启动按钮时,启动一个service,此时控制台显示oncreate();当再次点击启动按钮时,此时控制台显示onstartcommand();当点击停止按钮时,此时控制台显示ondestroy();再点停止就没反应了。再点启动就是oncreate();

界面和简单就不写了。

MainActivity:

package com.example.servicedemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

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

    private void setListener() {
        startServiceListener();
        stopServiceListener();
    }

    private void stopServiceListener() {
        findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                stopService(intent);
            }
        });
    }

    private void startServiceListener() {
        findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                startService(intent);
            }
        });
    }



}

MyService:

 1 package com.example.servicedemo;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.IBinder;
 6 import android.util.Log;
 7 
 8 public class MyService extends Service{
 9 
10     @Override
11     public IBinder onBind(Intent arg0) {
12         
13         return null;
14     }
15     
16     @Override
17     public void onCreate() {
18         // TODO Auto-generated method stub
19         super.onCreate();
20         Log.i("main", "onCreate()");
21     }
22 
23     @Override
24     public int onStartCommand(Intent intent, int flags, int startId) {
25         // TODO Auto-generated method stub
26         Log.i("main", "onStartCommand()");
27         return super.onStartCommand(intent, flags, startId);
28     }
29 
30     @Override
31     public void onDestroy() {
32         // TODO Auto-generated method stub
33         super.onDestroy();
34         Log.i("main","onDestroy()");
35     }
36 }

同时,要在清单中注册service:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.servicedemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.servicedemo.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="com.example.servicedemo.MyService"></service>
    </application>

</manifest>

上面这个是没有绑定service。下面介绍下绑定service并与之通信。

当启动service时,是绑定和启动一起,那么在解绑的过程中,也是解绑和停止一起。当启动service是,只是启动,没有绑定,那么在绑定之后再解绑,就只是解绑,没有停止service。

mainactivity:

package com.example.servicedemo;

import com.example.servicedemo.MyService.MyBinder;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {
    MyBinder mBinder;
    private ServiceConnection conn = new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            Log.i("main", "解绑service");
        }
        
        @Override
        public void onServiceConnected(ComponentName arg0, IBinder service) {
            mBinder = (MyBinder)service;
            Log.i("main", "绑定service" +"count="+mBinder.getCount());
            
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setListener();
    }

    private void setListener() {
        startServiceListener();
        stopServiceListener();
        bindServcieListener();
        unbindServiceListener();
    }

    private void unbindServiceListener() {
        findViewById(R.id.btnunbind).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                unbindService(conn);
            }
        });
    }
    //绑定service
    private void bindServcieListener() {
        findViewById(R.id.btnbind).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent service = new Intent(MainActivity.this,MyService.class);
                //service:将访问者mainactivity与服务绑定,指定要启动的service
                //conn:监听访问者和service之间的连接情况。有数据传递。
                //flag:是否自动创建service。
                bindService(service , conn, Context.BIND_AUTO_CREATE);
                
            }
        });
    }
    
    //停止service
    private void stopServiceListener() {
        findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                stopService(intent);
            }
        });
    }

    //启动service
    private void startServiceListener() {
        findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                startService(intent);
            }
        });
    }



}

myservice:

 1 package com.example.servicedemo;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 import android.util.Log;
 8 
 9 public class MyService extends Service{
10     int count = 10;
11     @Override
12     public IBinder onBind(Intent arg0) {
13         MyBinder myBinder = new MyBinder();
14         return myBinder;
15     }
16     
17     class MyBinder extends Binder{
18         public int getCount(){
19             return ++count;
20         }
21     }
22     
23     @Override
24     public void onCreate() {
25         // TODO Auto-generated method stub
26         super.onCreate();
27         Log.i("main", "onCreate()");
28     }
29 
30     @Override
31     public int onStartCommand(Intent intent, int flags, int startId) {
32         // TODO Auto-generated method stub
33         Log.i("main", "onStartCommand()");
34         return super.onStartCommand(intent, flags, startId);
35     }
36 
37     @Override
38     public void onDestroy() {
39         // TODO Auto-generated method stub
40         super.onDestroy();
41         Log.i("main","onDestroy()");
42     }
43     @Override
44     public boolean onUnbind(Intent intent) {
45         // TODO Auto-generated method stub
46         Log.i("main","onUnbind()");
47 //        return super.onUnbind(intent);
48         return true;//解除绑定后再绑定,这里要返回true。
49     }
50     @Override
51     public void onRebind(Intent intent) {
52         Log.i("main","onRebind()");
53         // TODO Auto-generated method stub
54         super.onRebind(intent);
55     }
56 }
原文地址:https://www.cnblogs.com/haojiahong/p/4596020.html