- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是关于基于内存的 IPC(如 LocalService 示例)但对于在同一进程中运行的两个应用程序:
我有两个应用程序(App1
、App2
)和一个共享项目(Shared
),它为两个应用程序定义了一些接口(interface)和抽象类:
Shared (regular Java project, references android.jar)
- abstract myAbstractService
- Binder myBinder
App1 (Android Project, references Shared)
- MainActivity
App2 (Android Project, references Shared)
- myService extends myAbstractService
两个应用程序在同一进程中运行( my.process
,在 <application>
中定义), App2
发表com.www.app2.myService
:
<-- Both Apps run in the same process -->
<manifest <!-- *snip* --> android:sharedUserId="my.shareduser">
<!-- ... -->
<application <!-- *snip* --> android:process="my.process">
<-- App2 exports the service -->
<service android:name="com.www.app2.myService" android:exported="true">
<intent-filter>
<action android:name="com.www.app2.myService" />
</intent-filter>
</service>
这是摘要myAbstractService
(myService
尚未添加任何新内容):
abstract public class GameClient extends Service
{
private static final String LOGTAG = "GameClient";
private myBinder binder = new myBinder();
public IBinder onBind(Intent intent)
{
Log.d(LOGTAG, "onBind()");
return this.binder;
}
public class myBinder extends Binder
{
public void sendMessage()
{
Log.d(LOGTAG, "sendMessage()");
}
}
}
当我尝试绑定(bind)到 myService
时(App2) 来 self 的 MainActivity
(应用程序 1):
public void onServiceConnected(ComponentName name, IBinder service)
{
Log.d("MS", service.getClass().toString());
main.this.t = (myBinder) service; // Exception in this line of course
}
我得到一个异常(exception):
DEBUG/MS(5464): class com.www.shared.myBinder
ERROR/AndroidRuntime(5464): java.lang.ClassCastException: com.www.shared.myBinder
由于两个应用程序在同一个进程中运行,内存耦合通信应该可以工作(至少我认为是这样)。我真的不想使用基于消息或基于广播的通信,因为我会发送很多消息。
我怀疑这个异常是由于两个不同的类加载器被用于同一个类而发生的?这种方法根本不可能/错误还是我遗漏了什么?
更新:
我的目标是编写一个非常模块化的应用程序,其中 App1 用作其他模块 (apps) 的委托(delegate)和启动应用程序。因为我不想发货 App1
每个应用程序都依赖它,我让它成为自己的应用程序。
假设我有第三个应用程序(App3,Android 项目)。 App2 & App3 均由 App1 启动(负责建立连接,而 App2 & App3 提供不同的应用逻辑(但具有相同的接口(interface))。
再想一想,我认为这也可以通过 android 库来解决(App1 和 Shared 与 App2
和 App3
合并为库,启动该库的 Activity 并等待结果)?然而,数据是不可分割的(网络连接),我不知道这个库如何在 android 市场上独立分发(比如 App2
和 App3
在那里发布,但要求也安装该库)。这会完全解决这个问题吗?
最佳答案
你是对的,你收到这个异常是因为涉及到两个类加载器。
我添加了接下来的两行代码:
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
...
Log.e(TAG, "Expected class loader: "+myBinder.class.getClass().getClassLoader());
Log.e(TAG, "Class loader: "+service.getClass().getClassLoader());
...
}
并收到这些日志:
Expected class loader: java.lang.BootClassLoader@4001bdb0
Class loader: dalvik.system.PathClassLoader[/data/app/com.inazaruk.shared.service-2.apk]
从日志中可以清楚地看出使用了另一个类加载器。这实际上是有道理的,因为您可以在一周后使用不同版本的 myBinder
类(或通过 myBinder< 传递的任何其他类)安装
接口(interface)直接或间接)。 App1
应用程序
已更新:
在您的场景中,您应该坚持使用 Android 库。请注意,Android 库直接嵌入到引用它们的应用程序中。它们不单独分发。 Here is my post解释 Android 库与简单的 jar 有何不同,以及其他相关的细微差别。
Android 库中仍然具有高度模块化,因为最终的 Android 应用程序仅包含它使用的模块。但这是编译时模块化,而不是运行时模块化。
虽然 Android 库存在一些问题:
AndroidManifest.xml
中的所有组件声明复制到 Android 应用程序的 AndroidManifest.xml
中。#1 计划很快修复(根据 Build Support roadmap )。 #2 和 #3 可能会在下一版本的 SDK 平台工具中得到修复。
关于android - 来自其他应用程序但相同用户标识/进程的 bindService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6630775/
我正在 R 中使用 RecordLinkage 库。 我有一个包含 ID、姓名、电话、邮件的数据框 我的代码如下所示: ids = data$id pairs = compare.dedup(data
我目前正在构建一个新的 ASP.NET MVC 5 项目,我想在 9 月左右发布。我需要选择一个成员(member)系统,但我目前对我应该采取哪个方向感到很困惑。当前的 SimpleMembershi
我正在为 Brackets 定制一个大纲插件,它使用正则表达式来识别当前打开的文件的大纲。 我使用 regex101.com 创建了以下正则表达式(使用环视来确定该行以七个空格开头并以“SECTION
我已在表中将一列标记为“身份” create table Identitytest( number int identity(1,001) not null, value varch
我不知道那是字符串还是数组... char str4[100] = { 0 }; 那个代码是字符串? 如果是,它打印什么? 最佳答案 I dont know if that a string or a
我这里有一个场景,当用户想要重置密码时,系统必须通过电子邮件向用户发送一个随机生成的临时密码。我尝试将临时密码存储到数据库中的一个新列中,但我不确定这种方法是否有效。有些人建议使用 token,如下所
Vista 的现代 Windows 应用程序中有一个很好的功能。它是窗口标题中的图片。例如新的 skype (v4) 和 google chrome 都有它。 我在想它背后的技术是什么?如果你关闭 a
比较相同泛型类型的两个实例的最佳(最简洁和最佳)方法是什么,以便比较引用类型的身份(相同的对象,所以不是调用 Equals) 和 value 类型以获得值 equality。 目前我这样做: stat
我使用以下 C# 代码来获取处理器信息。如果我在虚拟机上运行我的应用程序,则管理类为空。我使用 Oracle VM VirtualBox 作为我的虚拟电脑 (Windows XP SP3) Syste
创建帐户后,Windows 帐户(本地、域、Active Directory)的 SID 是否会更改?如果是,在什么条件下。 最佳答案 是的,当您将帐户迁移到新域时,它会发生变化。 这就是您 AD 帐
我正在使用 Identity Server 4 并且我已经自定义了我的 ASP.NET Identity 用户,如下所示: public class ApplicationUser : Identit
我创建了一个 IIS 管理工具,旨在创建新应用程序、将它们分配到新的 AppPool,并为与该 AppPool 关联的身份添加所需的文件夹 ACL。根据this article ,每当创建新的应用程序
我使用 ASP.NET Identity .. 我想将 session 超时设置为无限制或最大值。我试过一些东西,但没有效果。注意:我使用共享主机。 谢谢你。 //web.config /
我有一台 Win 2008 R2 Enterprise 机器,它在几个网站上运行良好,每个网站都有自己的应用程序池。 我在向 IIS AppPool\A、IIS AppPool\B 等授予权限(使用
现有数据库模型(简化): 1 个用户可以加入 1 个或多个访问组。 1个AccessGroup可以有1个或多个AccessItens。 MSDN Says: When an identity is c
在具有单个表继承层次结构的 Hibernate/JPA 环境中使用 PostgreSQL 时,我看到了奇怪的行为。 首先是我的环境: PostgreSQL 8.3 Spring 2.5.6SEC01
是声明“一个类具有唯一标识”。是真是假? Java 中的对象有其唯一标识(至少通过它们的内存地址),但是类也有唯一标识吗?由于类不是对象,我对此感到困惑。或者是否需要实例化一个类(甚至可能)? 最佳答
我正在尝试通过将主要组件分解为单独的网络服务器来使用微服务架构来实现网络应用程序。我正在使用 ASP.NET Identity(仅电子邮件/用户名登录,无 Facebook 等)和“主”应用程序服务器
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do you like your primary keys? 我知道使用 GUID 的好处,以及使用
我可以这样获取所有用户 var users = UserManager.Users.ToList(); 我能找到这样的角色 var role = db.Roles.SingleOrDefault(m
我是一名优秀的程序员,十分优秀!