gpt4 book ai didi

Android IPC,服务未实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:01 26 4
gpt4 key购买 nike

我有一个服务驻留在像这样的 lib 项目中

public abstract class MyService extends Service{
//service body here
}

我将我的 aidl 文件设置为与远程服务通信,该服务也包含在 lib 项目中,在此处复制 aidl 文件

package mypackage;

// Declare the communication interface which holds all of our exposed functions.
interface IMyService {
//interface body here
}

在 lib list 中,我已经这样声明了服务

<service
android:name="mypackage.core.MyService"
android:enabled="true"
android:exported="true"
android:process=":remote" >

<intent-filter>
<action android:name="mypackage.IMyService" />
</intent-filter>

</service>

我已将此库包含在我的应用程序中,但当我尝试从应用程序绑定(bind)服务时,它没有被实例化。任何人都可以建议我做错了什么,如果可以的话,可以指导我出路。中的服务在另一个属于 lib 的类中启动,如下所示

try{
Intent i = new Intent(MyService.class.getName());
i.setPackage("mypackage");
// start the service explicitly.
// otherwise it will only run while the IPC connection is up.
mAppContext.startService(i);
boolean ret = mAppContext.bindService(i,
mConnection, Service.BIND_AUTO_CREATE);
if(!ret){
MyLogger.log("Error");
}
}catch(Exception e){
MyLogger.log("err");
}

服务绑定(bind) API 总是返回 false 问题所在。这是创建 RemoteService 的主要方式吗?如果需要,我是否需要在应用程序 list 中添加此服务?

最佳答案

what would be the issue

首先,您的 Intent与您的 <service> 不匹配.

Intent i = new Intent(MyService.class.getName());

您正在传递一个 Action String看起来像 mypackage.core.MyService .但是,那不是 <action>为你的Service :

<action android:name="mypackage.IMyService" />

因此,您的 Intent不匹配任何内容,您无法绑定(bind)。


其次,你的Service 非常不安全。任何想要绑定(bind)的应用程序都可以绑定(bind)到它。如果您希望其他应用程序绑定(bind)到它,那很好,但是使用一些权限来保护它,以便用户可以投票决定哪些应用程序可以绑定(bind)到它。


第三,您使用隐式 Intent 进行绑定(bind),一个使用 Action 字符串之类的东西。这在 Android 5.0+ 上不起作用,因为您不能再使用隐式 Intent 绑定(bind)到服务。 .使用隐式 Intent发现一个服务很好,但是你需要转换 Intent明确的,包含组件名称。这是我在 this sample app 中执行此操作的方法:

  @Override
public void onAttach(Activity host) {
super.onAttach(host);

appContext=(Application)host.getApplicationContext();

Intent implicit=new Intent(IDownload.class.getName());
List<ResolveInfo> matches=host.getPackageManager()
.queryIntentServices(implicit, 0);

if (matches.size()==0) {
Toast.makeText(host, "Cannot find a matching service!",
Toast.LENGTH_LONG).show();
}
else if (matches.size()>1) {
Toast.makeText(host, "Found multiple matching services!",
Toast.LENGTH_LONG).show();
}
else {
Intent explicit=new Intent(implicit);
ServiceInfo svcInfo=matches.get(0).serviceInfo;
ComponentName cn=new ComponentName(svcInfo.applicationInfo.packageName,
svcInfo.name);

explicit.setComponent(cn);
appContext.bindService(explicit, this, Context.BIND_AUTO_CREATE);
}
}

Is this the prominent way of creating a RemoteService ?

很少有人创建远程服务。它们难以保护,难以处理协议(protocol)中的版本更改等。而且,在你的情况下,我不知道你为什么认为你需要远程服务,因为你显然是从你自己的应用程序绑定(bind)到服务。

关于Android IPC,服务未实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com