服务 一个长期运行在后台的用户组件 不依赖于Activity
只有当系统必须回收内存资源时 才会被销毁
首先是创建服务
当写好后 会自动在清单文件中注册
服务的生命周期和启动方式
先简单介绍一下 然后用两个小案例来日志打印验证
第一种启动方式 startService()
启动服务的组件和服务之间没有关联 组件销毁 服务依旧运行
验证下: package com.example.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class TestService extends Service { public TestService() { } @Override public void onCreate() { super.onCreate(); Log.i("文雅", "创建服务 onCreate()执行"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("文雅", "开启服务 onStartCommand()执行"); return super.onStartCommand(intent, flags, startId); } //此处为第一种启动方式 @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); Log.i("文雅", "关闭服务 onDestroy()执行"); } }
package com.example.service; import android.content.Intent; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class ToServiceActivity extends AppCompatActivity { @Override protected void onStart() { super.onStart(); setContentView(R.layout.activity_toservice); Button bt1 = findViewById(R.id.bt1); Button bt2 = findViewById(R.id.bt2); Intent testService = new Intent(this, TestService.class); bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(testService); } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(testService); } }); } }
第一次启动服务
关闭Activity 打开 服务直接启动
关闭服务
第二种启动方式 bindService()
组件绑定服务 解绑服务 服务即销毁 多个组件可绑定一个服务
* 第一个参数 指定启动的Service * 第二个参数 调用者与Service之间的连接状态 * 第三个参数 绑定服务时是否自动创建Service bindService(intent, myconn, BIND_AUTO_CREATE);
package com.example.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class MyBindService extends Service { public MyBindService() { } class MyBinder extends Binder { public void callMethod() { method(); } } @Override public void onCreate() { super.onCreate(); Log.i("芳芳", "创建服务 执行onCreate()方法"); } @Override public IBinder onBind(Intent intent) { Log.i("芳芳", "绑定服务 执行onBind()方法"); return new MyBinder(); } public void method() { Log.i("芳芳", "调用服务中的method()方法"); } @Override public boolean onUnbind(Intent intent) { Log.i("芳芳", "解绑服务 执行onUnbind()方法"); return super.onUnbind(intent); } }
package com.example.service; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.util.Log; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; public class BindServiceActivity extends AppCompatActivity implements View.OnClickListener { private Button btt1, btt2, btt3; private Myconn myconn; private MyBindService.MyBinder myBinder; // @SuppressLint("MissingInflatedId") 是一个 Android Lint 注解,用于告诉 Lint 工具忽略某个特定的警告 @SuppressLint("MissingInflatedId") @Override protected void onStart() { super.onStart(); setContentView(R.layout.activity_bindservice); btt1 = findViewById(R.id.btt1); btt2 = findViewById(R.id.btt2); btt3 = findViewById(R.id.btt3); btt1.setOnClickListener(this); btt2.setOnClickListener(this); btt3.setOnClickListener(this); } @Override public void onClick(View v) { //绑定服务 if (v.getId() == R.id.btt1) { if (myconn == null) { myconn = new Myconn(); } Intent intent = new Intent(this, MyBindService.class); /** * 第一个参数 指定启动的Service * 第二个参数 调用者与Service之间的连接状态 * 第三个参数 绑定服务时是否自动创建Service */ bindService(intent, myconn, BIND_AUTO_CREATE); } //调用服务中的方法 if (v.getId() == R.id.btt2) { myBinder.callMethod(); } //解绑服务 if (v.getId() == R.id.btt3) { if (myconn != null) { unbindService(myconn); myconn = null; } } } //bindService第二个参数 实现连接服务 private class Myconn implements ServiceConnection { // 成功绑定时 调用onServiceConnected()方法 // 失去连接时 调用onServiceDisconnected()方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (MyBindService.MyBinder) service; Log.i("芳芳", "服务成功绑定"); } @Override public void onServiceDisconnected(ComponentName name) { } } }
不能直接调用方法 必须在成功绑定后才能调用
绑定服务
调用方法
解绑服务
关于直接调用methon()方法 AI给出答复:
类型安全:onServiceConnected 方法接收一个 IBinder 类型的参数。尽管您知道这个 IBinder 实际上是 MyBinder 的一个实例,但编译器并不知道这一点。因此,您需要通过强制类型转换来将其转换为 MyBinder 类型,然后才能调用 callMethod() 方法。
访问权限:method() 方法是 MyBindService 类的一个公共方法,但它不是 IBinder 接口的一部分。因此,没有 MyBinder 作为中介,您无法直接访问它。
设计模式:使用 Binder 类是 Android 服务绑定的一种常见设计模式。它允许您定义特定的方法来与服务交互,而不是直接访问服务的所有公共方法。这有助于封装和抽象,使代码更加清晰和可维护。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?