【问题标题】:How to know which application (context) started/bound a service如何知道哪个应用程序(上下文)启动/绑定了服务
【发布时间】:2015-04-02 23:23:57
【问题描述】:

我有一个位于另一个包中的服务。 如何知道哪个 Activity 或应用程序(上下文)启动或绑定了该服务,知道许多应用程序可以在同一设备中访问(绑定)该服务?

我以这种方式启动/绑定服务:

    private void initService() {
        connection = new MyServiceConnection();
        Intent i = new Intent();
        i.setClassName("br.ufc.great.loccam", "br.ufc.great.loccam.service.SysSUService");
        context.startService(i);
        boolean ret = context.bindService(i, connection, Context.BIND_AUTO_CREATE);
        Log.d(appId, "initService() bound with " + ret);
    }

有没有办法获取绑定服务的应用程序的上下文?

【问题讨论】:

    标签: android service android-context


    【解决方案1】:

    您最多可以从 Binder 中获取进程 ID。

    如果你想从进程id中找到应用包名,你必须搜索ActivityManager.getRunningAppProcesses()的所有值中的RunningAppProcessInfo.pid

    但如果您同时编写服务和客户端代码,那么您可以为客户端代码编写一些额外的代码,以便在连接后识别上下文。

    【讨论】:

      【解决方案2】:

      您可以通过服务在Bindercall getCallingUid() 和/或getCallingPid() 尝试辨别是什么调用了请求。

      【讨论】:

      • 抱歉,我编辑了我的问题。我需要获取应用程序的上下文,因为我想访问服务上的应用程序资产文件夹。有可能吗??
      • @WitaloBenicio:如果您同时编写客户端和服务,最简单的方法是传入客户端的应用程序 ID。否则,欢迎您尝试通过BinderPackageManager 上的上述方法对其进行逆向工程。获得应用程序 ID 后,use createPackageContext() 将获得指向另一个应用程序的资产、资源等的 Context
      • 要使用 createPackageContext() 我需要传递一个带有我想要上下文的应用程序包的字符串。但是如何从正在运行的Service中获取包名是个问题……
      • 我必须知道每个绑定服务的应用程序的上下文。
      • @WitaloBenicio:“但是如何从正在运行的服务中获取包的名称是个问题”——正如我所写的,如果你同时编写客户端和服务,最简单的事情是供您传入客户端的应用程序 ID。否则,欢迎您尝试通过上述 Binder 上的方法以及 PackageManager 进行逆向工程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多