IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Service -> 正文阅读

[移动开发]Service

目录

1.service两种启动方式

2.区别

2.1启动

2.2销毁

2.3生命周期

3.Service生命周期方法

4.Service与Activity怎么实现通信

4.1通过Binder对象

在activity中绑定Service:

4.2Service通过BroadCast广播与Activity通信

5.IntentService

5.1是什么?

5.2怎么用?

5.3应用场景

5.4为什么用?与Service区别


1.service两种启动方式

startService
onCreate() -> onStartCommand() -> onDestroy()
bindService
onCreate() -> onbind() -> onUnbind()-> onDestroy()
应用场景:
  • 如果想要启动一个后台服务长期进行某项任务,那么使用startService
  • 如果只是短暂的使用,那么使用bindService。
  • 如果想启动一个后台服务长期进行任务,且这个过程中需要与调用者进行交互,那么可以两者同时使用,或者使用startService + BroadCast / EventBus等方式
  • 对于既使用startService,又使用bindService的情况,结束服务时需要注意的事项:Service的终止,需要unbindService和stopService都调用才行;

2.区别

2.1启动

startService:如果服务已经开启,多次执行startService 不会重复的执行 onCreate() , 而是会调用 onStart() 和 onStartCommand()。
bindService:如果服务已经开启,多次执行bindService时 ,onCreate onBind 方法并不会被多次调用

2.2销毁

startService:当执行stopService 时,直接调用 onDestroy 方法
bindService:调用者调用unbindService 方法或者调用者 Context 不存在了(如 Activity fifinish 了), Service 就会调用 onUnbind- >onDestroy

2.3生命周期

使用 startService() 方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
使用 bindService() 方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

3.Service生命周期方法

1 、单独使用 startService & stopService
(1)第一次调用 startService 会执行 onCreate onStartCommand
(2)之后再多次调用 startService 只执行 onStartCommand ,不再执行 onCreate
(3)调用 stopService 会执行 onDestroy
2 、单独使用 bindService & unbindService
(1)第一次调用 bindService 会执行 onCreate onBind
(2)之后再多次调用 bindService 不会再执行 onCreate onBind
(3)调用 unbindService 会执行 onUnbind onDestroy

4.ServiceActivity怎么实现通信

4.1通过Binder对象

1.Service 中添加一个继承 Binder 的内部类,并添加相应的逻辑方法
2.Service 中重写 Service onBind 方法,返回我们刚刚定义的那个内部类实例
3.Activity 中绑定服务 , 重写 ServiceConnection onServiceConnected 时返回的 IBinder Service 中的 binder )调用逻辑方法
MyService:
public class MyService extends Service {
    String msg;
    public MyService() {
        msg = "Msg from Service";
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }
 
    public class MyBinder extends Binder{
        public String getMsg(){
            return msg;
        }
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("Service","Service start");
        return super.onStartCommand(intent, flags, startId);
    }
}

在activity中绑定Service:

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, MyService.class);
        startService(intent);
        bindService(intent, sc, Context.BIND_AUTO_CREATE);
    }
 
    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.MyBinder myBinder = (MyService.MyBinder) service;
            Toast.makeText(MainActivity.this,myBinder.getMsg(),Toast.LENGTH_SHORT).show();
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 连接出现了异常断开了,MyService被杀掉了
            Toast.makeText(getApplicationContext(),"Service被解绑",Toast.LENGTH_SHORT).show();
            Log.i("MainActivity","Service被解绑");
        }
    };
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //退出记得解绑Service
        unbindService(sc);
    }
}

4.2Service通过BroadCast广播与Activity通信

5.IntentService

5.1是什么?

IntentService Service 的子类,默认开启了一个工作线程 HandlerThread ,使用这个工作线程逐一处理所有启动请求,在任务执行完毕后会自动停止服务。只要实现一个方法 onHandleIntent ,该方法会接收每个启动请求的Intent,能够执行后台工作和耗时操作。
可以启动 IntentService 多次,而每一个耗时操作会以队列的方式在 IntentService onHandlerIntent 回调方法中 执行,并且,每一次只会执行一个工作线程,执行完第一个再执行第二个。并且等待所有消息都执行完后才终止服务。

5.2怎么用?

1. 创建一个名叫 ServiceHandler 的内部 Handler
2. 把内部 Handler HandlerThread 所对应的子线程进行绑定
3.HandlerThread 开启线程 创建自己的 looper
4. 通过 onStartCommand() intent ,依次插入到工作队列中,并发送给 onHandleIntent() 逐个处理

5.3应用场景

可以用作后台下载任务 静默上传

5.4为什么用?与Service区别

IntentService 会创建独立的 worker 线程来处理所有的 Intent 请求
Service 主线程不能处理耗时操作,
IntentService 不会阻塞 UI 线程,而普通 Serveice 会导致 ANR 异常。
Service onBind() 提供默认实现,返回 null onStartCommand 提供默认实现,将请求 Intent 添加到队列中。
所有请求处理完成后, IntentService 会自动停止,无需调用 stopSelf() 方法停止 Service
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:17:25  更:2022-08-19 19:20:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:38:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码