我有一个android库,它作为jar文件分发,包含在第三方应用程序中。
在jar文件中是Android服务。 该服务通过jar文件中的facade类公开。 因此第三方不直接绑定到服务,他们只使用外观类。
我对这个架构有两个问题:
1) 如果两个完全独立的第三方应用程序使用此Facade(不同的包名,不同的用户ID等).class是创建的服务的两个实例,还是共享的单个实例?
2) 如果服务直接绑定到第三方应用程序而不是通过外观访问它会有所不同吗?
P.S。 http://developer.android.com/reference/android/app/Service.html 不回答这些问题。
答案 0 :(得分:3)
答案是,一次只能运行一个服务实例(无论如何,除非你跳过一些疯狂的箍以使其多次运行)。对Context.startService()和onCreate()的多次调用不会创建它的其他实例。如果你需要在第三方连接时做任何事情,它应该通过onStartCommand或从Context.bindService()返回的Binder对象传递。
您的模型独立于Android中的基础服务处理,无论您的外观是访问服务还是2个以上的第三方访问服务,行为都是相同的。
答案 1 :(得分:0)
好的,我对此进行了快速测试。
我修改了提供的jar文件,将onBind Intent中传递的值存储到2个静态变量中。 (stAppID和stAppVer)并在服务上调用某个方法时将其打印出来
当绑定到服务时,每个app都会使用Intent传递不同的值。
如果服务确实在应用程序之间共享,我会期待两件事:
以下是我测试的日志输出。
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): Thread = main
E/************ ServiceTest *************( 744): stAppID = APP AAAAAAAAAAAAA
E/************ ServiceTest *************( 744): stAppVer = VER AAAAAAAAAAAAA
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): ***************************************************
D/dalvikvm( 744): GC freed 4963 objects / 267800 bytes in 100ms
D/dalvikvm( 778): GC freed 2640 objects / 151400 bytes in 105ms
I/ActivityManager( 578): Starting activity: Intent { flags=0x10100000 comp={com.a.service.test/com.a.service.test.TrackingSample} }
W/InputManagerService( 578): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4370dac0
I/ActivityManager( 578): Starting activity: Intent { flags=0x10100000 comp={com.b.service.test/com.b.service.test.TrackingSample} }
W/InputManagerService( 578): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@436f7760
D/MMT ( 778): Creating new last event timestamp record for UIApplicationWillTerminateNotification
D/MMT ( 778): Run closed
D/MMT ( 778): Run started
E/************ ServiceTest *************( 778): ***************************************************
E/************ ServiceTest *************( 778): ***************************************************
E/************ ServiceTest *************( 778): Thread = main
E/************ ServiceTest *************( 778): stAppID = APP BBBBBBBBBBBBBBB
E/************ ServiceTest *************( 778): stAppVer = VER BBBBBBBBBBBBBBB
E/************ ServiceTest *************( 778): ***************************************************
E/************ ServiceTest *************( 778): ***************************************************
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): Thread = main
E/************ ServiceTest *************( 744): stAppID = APP AAAAAAAAAAAAA
E/************ ServiceTest *************( 744): stAppVer = VER AAAAAAAAAAAAA
E/************ ServiceTest *************( 744): ***************************************************
E/************ ServiceTest *************( 744): ***************************************************
D/dalvikvm( 744): GC freed 836 objects / 131136 bytes in 86ms
从中可以看出。因为 我得出的结论是服务没有在应用程序之间共享 ,所以这两个条件都没有成立。 (进程ID是每个日志行中冒号之前的括号中的数字)
当你想到它时,这是有道理的。 操作系统如何确定重新打包的jar包含相同版本的服务。 Android服务上没有声明版本元数据。
另一个问题是此服务使用数据库。如果该数据库是在存在安全风险的应用程序之间共享的。