0

私は Android プログラミングの初心者です (主に Windows で C# を使用しています)。サービスとアプリで構成されるコードを継承しました。サービスとアプリの一部を別のアプリで再利用したい。図書館に置いてます。1 つの問題を除いて、すべてがうまくいきました。サービスには、メイン アクティビティを画面に表示するコードが含まれています。このアクティビティを名前で呼び出します。明らかに、共通コードでそれを使用することはできません。サービス コードは次のようになります。

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 はアプリケーション固有であるため、ライブラリから削除しました。ただし、古いアプリを動作させる必要があります。ライブラリとアプリに分けて、ライブラリ内のかなりのロジックを別のアプリで再利用できるようにしたいだけです。その他のアプリでは、この「銀行イベント」の通知を特に受けたくありません。私が行ったとしても、コードは現在、1 つのアクティビティの名前でハードコーディングされています。

ここでロジックを分離する正しい方法は何ですか? サービスはイベントを「公開」し、関心のあるアプリは「サブスクライブ」する必要があるように思われます。少なくとも、それは私がよく知っている用語です。ちなみに、今のところ、コードのブロック全体をコメントアウトしただけで、もちろんこの通知を受け取ることを除いて、すべてが古いアプリで正常に動作します.

私の質問が広範であることを認識しています(そして謝罪します)。「人に魚を与えるのではなく、釣り方を教える」方がよいかもしれないので、このトピックをより広くカバーしている参考文献/記事/本を自由に推薦してください. 自分の限られたライブラリを自分で調べようとしましたが、私の本が入門的すぎるか (Android in Action はその 1 つです)、間違った場所を探しています。図書館の立ち上げや執筆サービスの話題でさえ、手に入れるのは難しいようです。1. サービスは、アプリの知識がなくても関心のあるアプリにイベントをどのように伝達するか 2. 何らかのメッセージに基づいてアプリをフォアグラウンドに移動するにはどうすればよいかサービスから受け取った 3. 既存のアプリを取得して、ライブラリ (非 GUI または非アプリ固有のもの) とアプリに侵入する方法。4.

前もって感謝します、デイブ

4

2 に答える 2

2

サービスはイベントを「公開」する必要があり、関心のあるアプリは「サブスクライブ」する必要があるようです。

このサービスは、イベントをユーザーに公開しています。

ここでロジックを分離する正しい方法は何ですか?

それはあなたが「正しい」をどのように定義するかに依存します。この場合、私はおそらくあなたがサービスを開始するために使用したあなたのエキストラとしてPendingIntent使用するためにを渡すでしょう。を実装しているため、エクストラにうまく入ります。このように、クライアントは、ユーザーがタップしたときに何が起こるかを指示します。必要なのは、関連する場合に表示することだけです。NotificationIntentPendingIntentParcelableIntentNotificationServiceNotification

サービスは、アプリの知識がなくても関心のあるアプリにイベントをどのように伝達しますか

これは、ここに示すユースケースには関係ありません。サービスからアプリにイベントを伝達していません。サービスからユーザーにイベントを伝達しています。ユーザーはアプリではありません。

そうは言っても、ブロードキャストを送信するIntentことも、コールバックメカニズムとして機能するエクストラとしてクライアントに何かを渡してもらうこともできます(たとえば、PendingIntentMessenger

サービスから受信したメッセージに基づいて、アプリをフォアグラウンドにするにはどうすればよいですか

サービスはを呼び出しますstartActivity()。これを行うのが面倒だと感じたユーザー(たとえば、ゲームの途中でアクティビティをポップアップする)は、あなたが気に入らない方法でフラストレーションを発散する可能性があることに注意してください。

現在採用しているアプローチ(--を表示する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 に答える