Android混合使用service小技巧

Posted 我想月薪过万

tags:

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

预备知识

android四大组件之service(一)_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/120816678?spm=1001.2014.3001.5502Android四大组件之service(二)_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/120853603?spm=1001.2014.3001.5502

总结知识点

/**
 * ClassName: SecondActivity <br/>
 * Description: <br/>
 * date: 2021/11/3 20:34<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 * <p>
 * 服务的开启方式有两种:
 * 1、startService()开启服务 ---> stopService()来停止服务
 * 优点:服务可以长期于后台运行;缺点:不能进行通讯
 * 生命周期 :
 * onCreate()--->onStartCommand()--->onDestroy()
 * 多次启动服务的生命周期
 * 如果服务已经启动,那么就不会再走 onCreate方法了,除非执行了onDestroy();
 * <p>
 * 2、bindService()绑定服务,如果服务没有启动,自动启动 ---> unBindService()解绑服务
 * 优点:可以进行通讯;缺点:不可以长期于后台运行,如果不解绑则会发生泄漏,如果解绑了,服务奖停止运行
 * 生命周期 :
 * onCreate() ---> onBind() ---> onUnBind() ---> onDestroy()
 * //混合开启服务的生命周期
 * 1、开启服务,然后去绑定服务,如果不取消绑定,那么就无法停止服务
 * 2、开启服务以后,多次绑定服务-解绑服务,服务不会被停止,只能通过 stopService()来停止服务
 * 推荐的混合开启服务方式:
 * 1、开启服务->为了确保服务可以长期于后台运行
 * 2、绑定服务->为了可以进行通讯
 * 3、调用服务内部的方法,比如说,我们控制音乐的播放、暂停、停止、播放
 * 4、退出Activity,要记得解绑服务->释放资源
 * 5、如果不使用服务了,要让服务停止,那么就调用stopService
 */

 SecondActivity.java源码

package com.wust.testdemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

import androidx.annotation.Nullable;

import com.wust.testdemo.interfaces.ICommunication;
import com.wust.testdemo.services.SecondService;

/**
 * ClassName: SecondActivity <br/>
 * Description: <br/>
 * date: 2021/11/3 20:34<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 * <p>
 *5、如果不使用服务了,要让服务停止,那么就调用stopService
 */
public class SecondActivity extends Activity {

    private boolean mIsBind;
    private ICommunication communication;

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

    /**
     * 开启服务
     *
     * @param view
     */
    public void startServiceClick(View view) {
        Intent intent = new Intent(this, SecondService.class);
        startService(intent);
    }

    /**
     * 绑定服务
     *
     * @param view
     */
    public void bindServiceClick(View view) {
        //绑定服务
        Intent intent = new Intent(this, SecondService.class);
        //如果服务已经启动,则不会再启动服务,如果服务没有启动,则启动服务
        mIsBind = bindService(intent, mConnection, BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            communication = (ICommunication) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mConnection = null;
        }
    };

    /**
     * 调用服务内部方法
     *
     * @param view
     */
    public void callServiceMethod(View view) {
        if (communication != null)
            communication.callServiceInnerMethod();
    }

    /**
     * 解绑服务
     *
     * @param view
     */
    public void unBindServiceClick(View view) {
        if (mIsBind && mConnection != null) {
            unbindService(mConnection);
        }
    }

    /**
     * 停止服务
     *
     * @param view
     */
    public void stopServiceClick(View view) {
        Intent intent = new Intent(this, SecondService.class);
        stopService(intent);
    }
}

SecondService.java源码

package com.wust.testdemo.services;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.wust.testdemo.interfaces.ICommunication;

/**
 * ClassName: SecondService <br/>
 * Description: <br/>
 * date: 2021/11/3 21:19<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */
public class SecondService extends Service {

    private class InnerBinder extends Binder implements ICommunication {

        @Override
        public void callServiceInnerMethod() {
            serviceInnerMethod();
        }
    }

    public static final String TAG = "SecondService";

    /**
     * 服务被创建
     */
    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate...");
        super.onCreate();
    }

    /**
     * 服务绑定
     *
     * @param intent
     * @return
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind...");
        return new InnerBinder();
    }

    /**
     * 服务启动
     *
     * @param intent
     * @param flags
     * @param startId
     * @return
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand...");
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 解绑
     *
     * @param intent
     * @return
     */
    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind...");
        return super.onUnbind(intent);
    }

    /**
     * 销毁
     */
    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy...");
        super.onDestroy();
    }

    private void serviceInnerMethod() {
        Log.d(TAG, "serviceInnerMethod...");
        Toast.makeText(this, "服务内部方法被调用了", Toast.LENGTH_SHORT).show();
    }

}

ICommunication接口源码

package com.wust.testdemo.interfaces;

/**
 * ClassName: ICommunication <br/>
 * Description: <br/>
 * date: 2021/10/19 22:15<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */
public interface ICommunication {
    void callServiceInnerMethod();
}

以上是关于Android混合使用service小技巧的主要内容,如果未能解决你的问题,请参考以下文章

Android代码的几点小技巧

VS中添加自定义代码片段——偷懒小技巧

zoho在线文档使用小技巧

提效小技巧——记录那些不常用的代码片段

Android开发之WebView(一)配置&小技巧

Android小部件,启动一个片段?