从Android库项目到使用它的应用程序的独特通信
有谁能告诉我一个从Android库项目到使用这个库的应用程序通信的好方法吗 一点说明:我的库接收GCM通知,并将其中一些通知转发给使用此库的应用程序。现在我通过图书馆发送的意图和一个广播接收器在应用程序中监听该意图来实现这一点 问题是:当我在应用程序中安装两个应用程序时,两个应用程序都会收到彼此的通知。有人有主意吗 提前谢谢 [编辑] 下面是一些代码。我在库中收到GCM通知,并将其转发到消费应用程序: GCMinentService:从Android库项目到使用它的应用程序的独特通信,android,library-project,Android,Library Project,有谁能告诉我一个从Android库项目到使用这个库的应用程序通信的好方法吗 一点说明:我的库接收GCM通知,并将其中一些通知转发给使用此库的应用程序。现在我通过图书馆发送的意图和一个广播接收器在应用程序中监听该意图来实现这一点 问题是:当我在应用程序中安装两个应用程序时,两个应用程序都会收到彼此的通知。有人有主意吗 提前谢谢 [编辑] 下面是一些代码。我在库中收到GCM通知,并将其转发到消费应用程序: GCMinentService: @Override protected void onHan
@Override
protected void onHandleIntent(Intent intent) {
...
String notificationString = intent
.getStringExtra(GCMConstants.NOTIFICATION);
Intent broadIntent = new Intent(getResources().getString(
R.string.con_broadcast_gcm_notification));
broadIntent.putExtra("callback", notification.getCallback());
context.sendBroadcast(broadIntent);
...
}
我的BroadcastReceiver监听con_broadcast_gcm_通知。它通过意图过滤器在清单中注册
manifest.xml
...
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="de.tuberlin.snet.gcm.notification" />
</intent-filter>
</receiver>
...
。。。
...
在Android中执行此操作的正确方法取决于“库”的安装方式
如果您的库本身作为单独的“应用程序”安装,则解决方案
就是对不同的广播使用不同的目的过滤器。这样,Android将只向那些宣传其兴趣的应用程序发送广播。您需要使用不同的意图过滤器更新您的客户端应用程序,并将库更改为使用相应客户端的意图过滤器作为其广播的一部分
如果您的库与您的两个客户端捆绑在一起,那么使用LocalBroadcastManager方法是一种选择。您可以使用
LocalBroadcasts
而不是普通广播。它们本质上类似于真实的广播,但只对一个应用程序可见。我假设您想从服务
与应用程序通信?然后,LocalBroadcasts
应该正是您想要的,但由于不知道您是如何实现的,我无法给您非常具体的建议
无论如何,如果要使用LocalBroadcasts
,首先必须创建一个BroadcastReceiver
,就像使用普通广播一样:
private static final String SOME_ACTION = "someAction";
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(SOME_ACTION.equals(action)) {
// Do your work
}
}
};
然后,您可以按如下方式注册和注销广播接收器
:
@Override
public void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.unregisterReceiver(broadcastReceiver);
}
Intent intent = new Intent(SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);
最后,您可以通过服务或应用程序中的任何其他地方发送广播,如下所示:
@Override
public void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.unregisterReceiver(broadcastReceiver);
}
Intent intent = new Intent(SOME_ACTION);
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.sendBroadcast(intent);
这并不能真正回答老年退休金计划的问题。我认为,从他的问题来看,他非常清楚如何使用意图以及如何处理不同的操作,但问题是,相同的意图
可以到达多个应用程序,即使只有一个应用程序应该接收到它。这就是广播的本质,你对此无能为力。但是你可以使用LocalBroadcasts
来回避这个问题,更多信息请参见我的答案。你有权发表自己的意见,但如果你对一个技术上正确的答案投反对票,即使你不同意,那也太苛刻了。事实上见我对你答案的评论(无需争论;)我实际上在考虑把意图弄清楚。我看到这个解决方案的问题是,库可以被任何人使用,不应该被修改。因此,使用我的库的应用程序必须在它自己的应用程序中定义一些不同的值,而我在库中使用这些值。这当然是可能的,但我正在寻找一种优雅的方法来最小化包含库所需的步骤。@Phil我还没有找到任何允许我在manifest.xml中注册LocalBroadcastManager的源代码。但是,让应用程序一直监听我的库中的意图是很重要的。因此,我决定采纳您的第一个建议,让使用库的每个应用程序的意图都不同。对我来说仍然是一个肮脏的补丁…@Zonic你不能为库引入一个“初始化”调用吗,这可以获取关于它正在运行的应用程序的信息,并形成一个特定于应用程序的广播名称。应用程序代码可以询问库它应该监听的广播名称,因此它被整齐地封装起来。本地广播只在进程上下文中起作用。如果库实际上是作为单独的独立安装分发的,则此解决方案不合适。我将编辑我的解决方案以澄清选项。@Phil是的,这是正确的。正如我在回答中所说,在不知道OP如何实现其库等的情况下,很难给出有用的建议,然而我的解决方案是“错误的”,而你的解决方案是。。。错的少一点?我不会对你的解决方案投反对票,尽管它很诱人。谢谢你到目前为止的回答菲尔和哈弗。LocalBroadcastManager对我来说也很有趣。但我看到该实现的问题是,我的BroadcastReceiver必须在任何活动上下文之外注册。即使应用程序未处于活动状态且应用程序仍必须侦听,也可能发生GCM通知。您是否知道本地广播是否也可以在manifest.xml中定义?我也会亲自检查的。真的非常感谢你们两位:)你可以用另一种方式,使用意图
在你的GCM库中注册服务
,因为你现在在你的库中注册课程,你不需要广播。从那时起,您可以根据您的意图专门针对注册的服务
,而无需求助于广播。我建议您编写一个manager/helper类来在客户端应用程序中实现这一点。可能是一个特殊的服务
子类,每个使用您的库的人都必须使用它。他们只需实现这个服务
子类,它会自动向库注册自己,等等。