背景
我想在我的Android应用程序中伪造接收推送通知的简单方法。
我使用SNS和GCM发送推送通知,但是每次我测试我的接收器处理时,我都不想发送真实的通知。
我创建了一个开发菜单'在主要活动中包含'清除缓存'虚假服务器错误'等等,所以我添加了一个假推送通知'项目到此列表。 (这仅出现在调试版本中)
当我选择菜单项时,我会以编程方式调用onMessageReceived方法调用GcmListenerService方法,因此伪造了一个推送通知。
问题
为了访问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设置将实例注入活动,但我不知道如何提供&#39;匕首的正确实例。
新建一个新的MyGcmListenerService显然会调用onMessageReceived方法,但是没有应用程序上下文,所以在创建Intent时我得到一个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)
Dagger提供者:(我不希望这个工作,因为它不是正确的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
}
}
我想我可能会认为这一切都错了,所以对任何其他技术持开放态度。但是,请不要建议涉及应用程序外部内容的选项(某些虚假服务器或其他内容),因为这只是在应用程序中欺骗通知,仅使用应用程序中可用的操作...也很有用向利益相关者演示通知等。
答案 0 :(得分:2)
让MyGcmListenerService.onMessageReceived
调用某种方法可能最简单,并且您的测试调用相同的方法。
但如果你真的想要实例化MyGcmListenerService
,那么你需要关注usual steps to start and connect to an Android Service。
答案 1 :(得分:0)
为什么这么复杂?你如何保存自己的registrationId,然后使用该registrationId发送通知来测试推送通知的工作与否?