背景:偽造GCMメッセージ
私はアンドロイドのアプリ内でプッシュ通知を受けた偽の簡単な方法をしたいと思います。
SNSとGCMを使用してプッシュ通知を送信しますが、受信者の処理をテストするたびに実際の通知を送信する必要はありません。
私は、 'clear cache'、 'fake server error'などの項目を含むメインアクティビティに「dev menu」を作成しました。このリストに「偽のプッシュ通知」アイテムを追加しました。
GcmListenerServiceの私の実装で、プログラムでonMessageReceivedメソッドを呼び出すという考えは、メニュー項目が選択されたときに、プッシュ通知を受信することを偽っています。
問題
onMessageReceivedメソッドにアクセスするために、私は(ドキュメントごとなど)のように、私のマニフェストに定義されているサービスであるGcmListenerService、へのアクセス権を持っている必要があります:
<service
android:name=".service.MyGcmListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
私は既存のDagger2セットアップを使用してアクティビティにインスタンスを挿入しようとしましたが、ダガーに正しいインスタンスを提供する方法がわかりません。
NEWINGアップ新しいMyGcmListenerServiceは明らかにonMessageReceivedメソッドを呼び出しますが、私はテントを作成NPEを得るように、何のアプリケーション・コンテキストを持っていない:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132)
at android.content.ComponentName.<init>(ComponentName.java:128)at android.content.Intent.<init>(Intent.java:4868)
at uk.co.blah.blah.service.MyGcmListenerService.onMessageReceived(MyGcmListenerService.java:30)
at uk.co.blah.blah.DashboardActivity.onOptionsItemSelected(DashboardActivity.java:297)
at android.app.Activity.onMenuItemSelected(Activity.java:3203)
ダガープロバイダ:(私はこれが動作するように期待していません、その正しくないGcmListenerServiceなど)
@Provides
@Singleton
MyGcmListenerService provideMyGcmListenerService() {
return new MyGcmListenerService();
}
メニュー項目ハンドラー:
if (id == R.id.fake_notification) {
Bundle bundle = new Bundle();
bundle.putString("message", "Test notification");
gcmListenerService.onMessageReceived("fakeNotification", bundle);
}
GcmListenerServiceの
私の実装:
public class MyGcmListenerService extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("message");
Timber.d("From: %s", from);
Timber.d("Message: %s", message);
// FIXME Fails here
Intent notificationAction = new Intent(this, DashboardActivity.class);
... do some other stuff to create the notification
}
}
私はこのすべて間違っについて行くかもしれないと思うので、任意の他の技術に開いています。しかし、アプリの中で何かを含むオプション(いくつかの偽のサーバや何か)を提案してはいけません。アプリの中で通知をスプーフィングするだけです。ステークホルダーへの通知など
主なアクティビティでfakeNotificationメソッドを作成し、onmessageに通知ビルダコードをコピーして貼り付けます。メニューから項目をクリックすると、このメソッドを呼び出すことができます –
私はコピー貼り付けコードの大ファンではありませんが、これはうまくいくでしょう - あなたの提案に感謝します:) – OliverDeLange