我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理

可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现。

《一》下面大体说一下我在极客学院跟着视频做的一个Service的小实现

1,首先点击左上角file->new往下拉,看到一个Service,创建MyService.java

  这个就是我们的Service服务。

  后续可以在这其中添加想要在后台运行的关键代码等。

2,首先创建项目后,在layout或中的xml中添加两个按钮btnStartSevice和btnStopSevice

程序中的Sevice是拼写错误,应该是Service,如果路人看到请不要打脸。。。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="examples.ouc.com.learnsevice2.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:text="Start Sevice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartSevice" />

    <Button
        android:text="Stop Sevice"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnStopSevice" />
</LinearLayout>

3,然后在MainActivity中配置这两个按钮。

 1 package examples.ouc.com.learnsevice2;
 2 
 3 import android.content.Intent;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 
 8 public class MainActivity extends AppCompatActivity {
 9 
10     private Intent intent;
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_main);
15         
16         //通过intent可以实现代码复用
17         intent =new Intent(MainActivity.this,MyService.class);
18         
19         //简单的对两个按钮设置监听器。
20         findViewById(R.id.btnStartSevice).setOnClickListener(new View.OnClickListener() {
21             @Override
22             public void onClick(View v) {
23                 
24                 //开始服务
25                 startService(intent);
26             }
27         });
28 
29         findViewById(R.id.btnStopSevice).setOnClickListener(new View.OnClickListener() {
30             @Override
31             public void onClick(View v) {
32                 
33                 //停止服务
34                 stopService(intent);
35             }
36         });
37     }
38 }

4,在MyService中进行相应的操作配置。

 1 package examples.ouc.com.learnsevice2;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.IBinder;
 6 
 7 public class MyService extends Service {
 8     public MyService() {
 9     }
10 
11     @Override
12     public IBinder onBind(Intent intent) {
13         // TODO: Return the communication channel to the service.
14         throw new UnsupportedOperationException("Not yet implemented");
15     }
16 
17     @Override
18     //重写的onStartCommand在startService()运行时自动运行。
19     public int onStartCommand(Intent intent, int flags, int startId) {
20         new Thread(){
21             @Override
22 
23             public void run() {
24                 super.run();
25 
26                 //通过设置输出一行代码来判断服务是否一直在运行中。
27                 while(true){
28                 System.out.println("sevice is running...");
29                 try {
30 
31                     //间隔2s输出一次
32                     sleep(2000);
33                 } catch (InterruptedException e) {
34                     e.printStackTrace();
35                 }}
36             }
37         }.start();
38         return super.onStartCommand(intent, flags, startId);
39     }
40 }

5,最后,我们就可以发布到我们的AVD上进行运行了,点击开始服务,就可以在AS下面run运行状态框中看到

  每隔两秒钟,就打印一行 sevice is running...

 

这个实例很简单,只是实现Service的后台运行,实际项目中,这个功能是十分重要的,希望自己日后用到时,能够想起来。。。菜鸟立flag

 

《二》service的绑定与声明周期

我们对上面的代码进行一些改动

1,首先,添加两个按钮,指示绑定服务,和解除绑定服务

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:id="@+id/activity_main"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:paddingBottom="@dimen/activity_vertical_margin"
 8     android:paddingLeft="@dimen/activity_horizontal_margin"
 9     android:paddingRight="@dimen/activity_horizontal_margin"
10     android:paddingTop="@dimen/activity_vertical_margin"
11     android:orientation="vertical"
12     tools:context="examples.ouc.com.learnsevice2.MainActivity">
13 
14     <TextView
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:text="Hello World!" />
18 
19     <Button
20         android:text="Start Sevice"
21         android:layout_width="match_parent"
22         android:layout_height="wrap_content"
23         android:id="@+id/btnStartSevice" />
24 
25     <Button
26         android:text="Stop Sevice"
27         android:layout_width="match_parent"
28         android:layout_height="wrap_content"
29         android:id="@+id/btnStopSevice" />
30     <Button
31         android:text="Bind Sevice"
32         android:layout_width="match_parent"
33         android:layout_height="wrap_content"
34         android:id="@+id/btnBindSevice" />
35     <Button
36         android:text="Unbind Sevice"
37         android:layout_width="match_parent"
38         android:layout_height="wrap_content"
39         android:id="@+id/btnUnbindSevice" />
40 </LinearLayout>
View Code

2,然后我们在MainActivity中进行配置

 1 package examples.ouc.com.learnsevice2;
 2 
 3 import android.content.ComponentName;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.content.ServiceConnection;
 7 import android.os.IBinder;
 8 import android.support.v7.app.AppCompatActivity;
 9 import android.os.Bundle;
10 import android.view.View;
11 
12 public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
13 
14     private Intent intent;
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19 
20         //通过intent可以实现代码复用
21         intent =new Intent(MainActivity.this,MyService.class);
22 
23         //简单的对两个按钮设置监听器。
24         findViewById(R.id.btnStartSevice).setOnClickListener(this);
25 
26         findViewById(R.id.btnStopSevice).setOnClickListener(this);
27 
28         findViewById(R.id.btnBindSevice).setOnClickListener(this);
29         findViewById(R.id.btnUnbindSevice).setOnClickListener(this);
30     }
31 
32     @Override
33     public void onClick(View v) {
34         switch (v.getId()){
35             case R.id.btnStartSevice:
36                 startService(intent);
37                 break;
38             case R.id.btnStopSevice:
39                 stopService(intent);
40                 break;
41             case R.id.btnBindSevice:
42                 //bindService(Intent参数,服务的连接,服务的状态)
43                 bindService(intent,this,Context.BIND_AUTO_CREATE);
44                 break;
45             case R.id.btnUnbindSevice:
46                 unbindService(this);
47                 break;
48         }
49     }
50 
51     @Override
52     //服务被绑定成功后执行
53     public void onServiceConnected(ComponentName name, IBinder service) {
54         System.out.println("Service connected!");
55     }
56 
57     @Override
58     //服务所在进城崩溃或者北杀掉时候执行。
59     public void onServiceDisconnected(ComponentName name) {
60 
61     }
62 }
View Code

3,然后在MyService中进行一些改动,方便我们查看是否什么时候创建与销毁。

 1 package examples.ouc.com.learnsevice2;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 
 8 public class MyService extends Service {
 9 
10     //通过设定一个flag,判断service是否仍然在运行
11     private boolean serviceRunning = false;
12     public MyService() {
13     }
14 
15     @Override
16     public IBinder onBind(Intent intent) {
17         // TODO: Return the communication channel to the service.
18         //throw new UnsupportedOperationException("Not yet implemented");
19         return new Binder();
20     }
21 
22     @Override
23     //重写的onStartCommand在startService()运行时自动运行。
24     public int onStartCommand(Intent intent, int flags, int startId) {
25         System.out.println("onStartCommand");
26         new Thread(){
27             @Override
28 
29             public void run() {
30                 super.run();
31 
32                 //通过设置输出一行代码来判断服务是否一直在运行中。
33                 //只有service仍在运行时,才会输出在这句话
34                 while(serviceRunning){
35                 System.out.println("sevice is running...");
36                 try {
37 
38                     //间隔2s输出一次
39                     sleep(2000);
40                 } catch (InterruptedException e) {
41                     e.printStackTrace();
42                 }}
43             }
44         }.start();
45         return super.onStartCommand(intent, flags, startId);
46     }
47 
48     @Override
49     public void onCreate() {
50         super.onCreate();
51         serviceRunning = true;
52         System.out.println("service create!");
53     }
54 
55     @Override
56     public void onDestroy() {
57         super.onDestroy();
58         System.out.println("service destory!");
59         serviceRunning = false;
60     }
61 }
View Code

4,然后我们可以发布,执行。