0

我是 Android 编程的新手(我主要在 Windows 上使用 C#)。我继承了一些由服务和应用程序组成的代码。我想在另一个应用程序中重用该服务和一些应用程序。我把它放在图书馆里。除了一个问题,一切都很顺利。该服务有一些代码将主要活动放在屏幕上。它按名称调用此活动。显然,我不能在通用代码中使用它。服务代码如下所示:

final int NOTIFY_1 = 0x1001;
NotificationManager notifier = (NotificationManager) context.getSystemService(
                    Context.NOTIFICATION_SERVICE);

final Notification notify = new Notification(
            R.drawable.icon_my_color, ticker, System.currentTimeMillis());

notify.number = 1;
notify.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
 notify.ledARGB = android.graphics.Color.CYAN;
notify.ledOnMS = 500;
notify.ledOffMS = 500;

Intent toLaunch = new Intent(context, MyBankingActivity.class);
toLaunch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intentBack = PendingIntent.getActivity(context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT);

notify.setLatestEventInfo(context, title, message, intentBack);
notifier.notify(NOTIFY_1, notify);

当发生一些有趣的事情(银行账户变为负数或其他事情)时,此代码将由服务运行。问题是上面硬编码的“MyBankingActivity.class”。我已经从库中删除了 MyBankingActivity,因为它是特定于应用程序的。但是,我必须让旧应用程序正常工作。我只想把它分成一个库和应用程序,这样我就可以在另一个应用程序中重用库中的大量逻辑。在那个其他应用程序中,我并不特别希望收到有关此“银行事件”的通知。即使我这样做了,代码目前也是用一个活动的名称硬编码的。

在这里分离逻辑的正确方法是什么?看起来服务应该“发布”事件,感兴趣的应用程序应该“订阅”。至少这是我熟悉的术语。顺便说一句,目前,我刚刚注释掉了整个代码块,并且在旧应用程序中一切正常,当然除了收到此通知。

我意识到(并道歉)我的问题很广泛。由于“授人以渔,不如授人以渔”可能更好,因此请随意推荐涵盖该主题的参考资料/文章/书籍。我曾尝试自己查看有限的图书馆,但要么我的书太介绍性(Android in Action 就是其中之一),要么我找错地方了。即使是建立图书馆和写作服务的话题似乎也很难找到。在我看来,有几个关键概念我很弱: 1. 服务如何在不了解应用程序的情况下将事件传达给感兴趣的应用程序 2. 如何根据某些消息将应用程序带到前台从服务 3 收到。如何获取现有应用程序并闯入库(对于非 gui 或非应用程序特定的东西)和应用程序。4.

非常感谢,戴夫

4

2 回答 2

2

看起来服务应该“发布”事件,感兴趣的应用程序应该“订阅”。

该服务正在向用户发布事件。

在这里分离逻辑的正确方法是什么?

这取决于您如何定义“正确”。在这种情况下,我可能会将PendingIntent用于与 the 一起使用Notification的附加项传递给Intent用于启动服务的 。PendingIntent实现Parcelable,因此很好地融入了一个Intent额外的。通过这种方式,客户端决定用户点击时会发生什么Notification——所有Service需要做的就是Notification在相关时显示。

服务如何在不了解应用程序的情况下将事件传达给感兴趣的应用程序

这与您在此处介绍的用例无关。您没有将事件从服务传递到应用程序。您正在将来自服务的事件传达给用户。用户不是应用程序。

话虽如此,您可以发送广播,或者让客户端传递一些作为Intent额外的东西,作为回调机制(例如PendingIntent,,Messenger)。

如何根据从服务收到的一些消息将应用程序带到前台

服务调用startActivity()。请注意,如果用户觉得您这样做很烦人(例如,在他们的游戏中弹出一个活动),他们可能会以您不喜欢的方式发泄他们的挫败感。

在大多数情况下,您目前采用的方法(显示 a Notification)是正确的。

如何获取现有应用程序并闯入库(对于非 gui 或非应用程序特定的东西)

对于任何值得一提的操作系统,这都无法抽象地回答。

通知的工作原理......

在文档和大多数介绍性 Android 书籍中都有介绍。

于 2011-12-28T18:26:13.110 回答
1

这与Intent实际启动其他活动的代码行有关。

你有一个

Intent toLaunch = new Intent(context, MyBankingActivity.class);

这将告诉系统“我想对名为的活动做一些事情:......”作者给出的意图名称已经告诉你会发生什么。

然后意图收到几个标志

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP

(长话短说)如果活动仍在后台某处运行(或者更准确地说,如果它在历史堆栈上),他们会确保将活动置于最前面。

然后是 PendingIntent

PendingIntent intentBack = PendingIntent.getActivity(
    context, 0, toLaunch, PendingIntent.FLAG_CANCEL_CURRENT);

我对 PendingIntent 不太熟悉,但我认为它在这里的使用方式不正确。

至于您的问题:1)您可以创建意图并让应用程序为它们注册一个侦听器 2)这就是意图所做的事情,它告诉系统将该活动带到前台(或您可以在意图)3)取决于应用程序/代码

4) http://developer.android.com/reference/android/app/NotificationManager.html 在那里你还应该找到关于所有其他主题的信息

于 2011-12-28T18:38:05.217 回答