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小技巧的主要内容,如果未能解决你的问题,请参考以下文章