首页 > 其他分享 >Android 使用绑定式调用service中的方法

Android 使用绑定式调用service中的方法

时间:2024-06-16 14:58:54浏览次数:15  
标签:service Service void 绑定 import Android public MyBinder MyBindService

在Android中,Service有两种启动方式:startService()和bindService()。

startService()启动Service时,Service会被创建并且调用onCreate()和onStartcommand()方法。Service会一直保持运行状态,直到调用stopService()或者stopSelf()方法。

bindService()启动Service时,Service会被创建并且调用onCreate()方法,但不会调用onStartcommand()方法。通过bindService()方法绑定的组件可以与Service进行通信,但是当所有绑定的组件都解绑后,Service会自动销毁。

因此,startService()方式启动的Service是一种独立的组件,可以在后台持续运行执行任务,而bindService()方式启动的Service则是一种与组件绑定的服务,只有在绑定的组件存在时才会运行。

本文讲述的是与组件绑定的Service的通信

全部的项目结构放在这里主要讲述的是bindService

package com.example.servicetest;

import androidx.appcompat.app.AppCompatActivity;

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 com.example.servicetest.Service.MyBindService;
import com.example.servicetest.Service.myService;

public class MainActivity extends AppCompatActivity {
    private MyBindService.MyBinder mBinder = null;

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBinder = (MyBindService.MyBinder)service;
            mBinder.test();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

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

    public void startService(View view) {
        Intent intent = new Intent(this, myService.class);
        startService(intent);
    }

    public void bindService(View view) {
        Intent intent = new Intent(this, MyBindService.class);
        bindService(intent,conn,BIND_AUTO_CREATE);
    }
}

我们这里讲述一下ServiceConnection这个方法,这个方法是用于处理Service的连接和断开的,需要重写两个方法,见名知意我就不分辨了.

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBinder = (MyBindService.MyBinder)service;
            mBinder.test();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

这里的service需要传入的是一个IBinder的类型,所以我们需要对类型进行强制转换,我们不需要对IBinder这个接口进行单独的实现,因为通过在Service中写内部类继承Binder类的方式就是对IBinder接口的实现.

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return new MyBinder(this);
    }

绑定返回BInd对象,用于Service和Activity之间进行通信

package com.example.servicetest.Service;

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

import androidx.annotation.Nullable;

public class MyBindService extends Service {

    public void test(){
        Log.d(TAG, "test: 这是");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return new MyBinder(this);
    }
    private static final String TAG = "MyBindService2";
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind: ");
        return super.onUnbind(intent);
    }
    public class MyBinder extends Binder{
        private MyBindService myBindService;
        public MyBinder(MyBindService bindSercive) {
            myBindService = bindSercive;
        }

        public void test(){
            Log.d(TAG, "test: ");
            myBindService.test();
        }
    }
}

Service中的几个重写的方法就不讲述了,见名知意即可,我们主要讲述的是Service中的这个内部类

    public class MyBinder extends Binder{
        private MyBindService myBindService;
        public MyBinder(MyBindService bindSercive) {
            myBindService = bindSercive;
        }

        public void test(){
            Log.d(TAG, "test: ");
            myBindService.test();
        }
    }

这里的MyBinder继承Binder实现了IBinder接口的实现,MyBinder方法传入的是MyBindService的对象,这里是为了实现内部类和Service的关联,从而能在内部类中调用Service中的方法,这样子就能实现,多层的调用了.

标签:service,Service,void,绑定,import,Android,public,MyBinder,MyBindService
From: https://blog.csdn.net/2301_81869574/article/details/139712873

相关文章

  • Android面试题之Java 泛型和Kotlin泛型
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点定义:JDK5引入的一种参数化类型特性继承和实现接口可以多个staticclassA{}staticinterfaceB{}staticinterfaceC{}//类必须在接口的前面staticclassD<......
  • Android Media Framework(六)插件式编程与OMXStore
    必读:AndroidMediaFramework-开篇OpenMAXILSpec阅读到上一节就结束了,这一节开始正式进入到Framework阅读阶段,我们将了解OpenMAX框架是如何与AndroidFramework连接的。1、插件式编程插件式编程(Plugin-basedProgramming)是一种软件开发模式,它允许开发者通过编写独立的、......
  • Android Media Framework(六)插件式编程与OMXStore
    OpenMAXILSpec阅读到上一节就结束了,这一节开始正式进入到Framework阅读阶段,我们将了解OpenMAX框架是如何与AndroidFramework连接的。1、插件式编程插件式编程(Plugin-basedProgramming)是一种软件开发模式,它允许开发者通过编写独立的、可插拔的模块(称为插件)来扩展应用......
  • Android Media Framework(五)Tunnel Mode
    本篇将聚焦AndroidTunnelMode,详细解析组件之间隧道连接过程、数据传递过程、组件销毁过程。通过阅读本篇内容,我们应能对tunneled组件的连接过程和buffer分配过程有所了解。1、TunnelMode介绍ILSpec详细描述了TunnelComponent的实现方式,但内容较为晦涩难懂,网上相关......
  • Android基础-系统启动流程
    一、引言Android系统的启动流程是一个复杂而精密的过程,它涉及到硬件的初始化、软件的加载以及服务的启动等多个环节。这个过程不仅关系到设备的稳定性和性能,还直接影响到用户的使用体验。本文将详细阐述Android系统的启动流程,并结合相关参考文章中的信息,对各个环节进行深入的......
  • android录屏开发总结
    开始之前先说明一下关键几个类的作用:MediaProjectionManager:录屏主要管理类,发出截屏意图提醒、创建录屏等IBinder:IBinder是Android中的一个接口,它定义了一组用于进程间通信的方法。通过IBinder,我们可以在不同的进程之间传递数据和调用方法,实现进程间的交互。在Android系统中,每......
  • flutter AndroidStudio 模拟器无网络连接
    Error:SocketException:Failedhostlookup:''(OSError:Noaddressassociatedwithhostname,errno=7) 命令启动模拟器1.找到你的模拟器名字,默认在C:\users\xx\.android\avd目录下,如图3-3。如果找不到可以在AndroidStudio->AVDManager->showondisk定位到此目录......
  • UE Puerts 在 Android 的调试方法
    配置流程在JsEnv.Build.cs添加WITH_INSPECTOR编译添加这个宏就开启了全平台调试功能看到这里就知道V8Inspector之前仅在三个平台会编译,现在会在任意平台编译了打包的时候会发现存在编译错误(如果没有就是后续Puerts版本修复了这个问题),接下来修复这个错误(没有IOS......
  • Java与服务网格(Service Mesh):构建高效微服务架构
    在微服务架构成为企业开发标准的今天,如何有效地管理众多微服务之间复杂的通信成为了一个挑战。服务网格作为一种解决方案,它通过提供一个专门的基础设施层来处理服务间通信,从而使得应用开发更加专注于业务逻辑而非通信细节。本文将介绍服务网格的基本概念,探讨其在Java环境中的应......
  • ASP.NET Core应用程序11:使用模型绑定
      模型绑定是使用从HTTP请求获得的数据值,创建操作方法和页面处理程序所需的对象的过程。本章描述模型绑定系统的工作方式;显示它如何绑定简单类型、复杂类型和集合;并演示如何控制流程,以指定请求的哪一部分提供应用程序所需的数据值。  本章介绍了模型绑定特性,展示了如何使......