我个人的理解是:我们平时使用的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,然后我们可以发布,执行。