Android Service(服务)

Posted 穷少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Service(服务)相关的知识,希望对你有一定的参考价值。

参考文章

  1. 关于Android Service真正的完全详解,你需要知道的一切
  2. Android Service 启动方式,生命周期和应用场景详解

android Service 启动方式

android有两种服务启动模式,startServicebindService

startService 和 bindService 区别

模式名称特点
startService一旦服务开启跟调用者(开启者)就没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,只有通过调用停止服务的方法才能停止服务,或者是整个程序被kill掉,那么服务也会随之kill。开启者不能调用服务里面的方法
bindServicebind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。绑定者可以调用服务里面的方法。(说白了就和小程序一样,打开的时候使用,用完了就关闭拍屁股走人,一次性滴)注意:绑定服务不会调用onstart()或者onstartcommand()方法

在这里插入图片描述

Service的创建以及在AndroidManifest.xml文件中的声明

我们通过android studio创建service的时候,编译器自动的帮助我们在清单文件中声明了相关属性

在这里插入图片描述

        <service
            android:name=".StartService"
            android:enabled="true"
            android:exported="true"></service>
  • android:name:对应Service类名
  • android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。
  • android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值true的情况下服务才会被激活,否则不会激活。

startService生命周期

  1. startService(Intent)通过这种方式开启的服务,执行的生命周期方法:第一次调用startService的时候:onCreate→onStartCommand再次调用startService的时候:只执行onStartCommand
  2. 想停止用startService开启的服务要使用stopService(Intent),stopService执行之后,Service会走onDestroy()方法,执行之后Service销毁,再次调用stopService没有反应
  3. 如果在Activity中通过startService方法开启一个服务,当Activity退出的时候Service不会销毁,依然在后台运行,只有手动调用stopService或者在应用管理器中关闭Service,服务才会销毁

startService案例

设计一个界面,上面有两个按钮,分别是启动按钮与停止按钮,用来启动、停止服务
在这里插入图片描述
创建一个service

public class StartService extends Service {
	
	// 声明一个线程
    private Thread myThread;
	
	// 控制线程的运行
    private boolean flag=true;

	// 判断当前service内的线程是否在运行
    private boolean trigger=false;

    public StartService() {
    }

    /**
     * 绑定服务时才会调用
     * 必须要实现的方法
     * @param intent
     * @return
     */
    @Override
    public IBinder onBind(Intent intent) {
        Log.w("StartService", "onBind()");
       return null;
    }

    /**
     * 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
     * 如果服务已在运行,则不会调用此方法。该方法只被调用一次
     */
    @Override
    public void onCreate() {
        super.onCreate();
		// 在服务创建时,实例化一个线程
        myThread=new Thread(new Runnable() {
            @Override
            public void run() {
                while(flag){
                    try {

                        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Log.w(format.format(new Date(System.currentTimeMillis())), "服务正在运行。。。。");
                        Thread.sleep(1000);

                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
        });
        Log.w("StartService", "服务被创建了");
    }

    /**
     * 每次通过startService()方法启动Service时都会被回调。
     * @param intent
     * @param flags
     * @param startId
     * @return
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.w("StartService", "服务onStartCommand()被调用了");
		
		// 在onStartCommand触发时启动线程,如果线程已经启动就无须再次启动
        if(!trigger){
            myThread.start();
            trigger=true;
        }
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 调用stopService()停止服务销毁时的回调
     */
    @Override
    public void onDestroy() {
	// 在service销毁时结束进程
	// 将进程的运行标志设为false
        flag=false;
        trigger=false;
        Log.w("StartService", "服务被销毁了");
        super.onDestroy();
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

    private Button startBtn;
    private Button stopBtn;

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

        startBtn = this.findViewById(R.id.startBtn);
        stopBtn = this.findViewById(R.id.stopBtn);

        // 创建服务实例
        final Intent service = new Intent(this, StartService.class);


        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 启动服务
                MainActivity.this.startService(service);
            }
        });


        stopBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 停止服务
                MainActivity.this.stopService(service);
            }
        });
    }
}

点击启动服务时,启动服务的activity进入了后台,服务并不会结束

在这里插入图片描述

结束服务只有kill当前程序或者调用stopService方法来结束service

在这里插入图片描述

以上是关于Android Service(服务)的主要内容,如果未能解决你的问题,请参考以下文章

Android跨进程通信AIDL服务

Android-14-Service(服务)

详解Android WebView加载html片段

在 android 首选项片段中使用 startService()

Android service ( 二) 远程服务

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段