在Android应用程序中分离逻辑和GUI。服务有app的知识,不应该

时间:2011-12-28 18:13:33

标签: android service notifications code-separation

我是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.通知如何工作....

非常感谢, 戴夫

2 个答案:

答案 0 :(得分:2)

  

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

该服务正在向用户发布活动。

  

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

这取决于你如何定义“正确”。在这种情况下,我可能会将PendingIntentNotification一起用作您用于启动服务的Intent的额外内容。 PendingIntent实现了Parcelable,因此非常适合Intent额外的Notification。通过这种方式,客户端会指示当用户点按Service时会发生什么 - 所有Notification需要做的就是在相关时显示Intent

  

服务如何在不知道应用程序的情况下将事件传递给感兴趣的应用程序

这与您在此处提供的用例无关。您没有将服务中的事件传达给应用。您正在将服务中的事件传达给用户。用户不是应用程序。

话虽这么说,你可以发送广播,或让客户端传递一些作为回调机制的PendingIntent额外内容(例如MessengerstartActivity())。

  

如何根据从服务

收到的消息将应用程序带到前台

服务调用Notification。请注意,发现您为此而烦恼的用户(例如,在游戏过程中弹出活动)可能会以您不会欣赏的方式发泄他们的挫败感。

您目前采用的方法 - 显示{{1}} - 在大多数情况下是正确的。

  

如何获取现有应用并闯入图书馆(适用于非gui或非app特定内容)

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

  

通知如何运作.....

这涵盖了in the documentation和大多数介绍性的Android书籍。

答案 1 :(得分: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)取决于app / code

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