我有一个项目作为库导出到我项目的精简版。 在库项目中,我实现了推送通知。我把图书馆项目作为一个普通项目,推送通知工作正常。 当我将这个项目作为精简版项目中的库导入时,我的问题就出现了。推送通知失败了。
这是我的GCMIntentService类:
public class GCMIntentService extends GCMBaseIntentService {
public static final String SENDER_ID = "206703456431";
public GCMIntentService() {
super(SENDER_ID);
}
private static final String TAG = "===GCMIntentService===";
@Override
protected void onRegistered(Context arg0, String registrationId) {
Log.i(TAG, "Device registered: regId = " + registrationId);
Applications app = (Applications) getApplication();
app.setDeviceToken(registrationId);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
Log.i(TAG, "unregistered = " + arg1);
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Log.i(TAG, "Received message. Extras: " + arg1.getExtras());
String message = arg1.getExtras().getString("message");
displayMessage(arg0, message);
// notifies user
generateNotification(arg0, message);
}
@Override
protected void onError(Context arg0, String errorId) {
Log.i(TAG, "Received error: " + errorId);
}
@Override
protected boolean onRecoverableError(Context context, String errorId) {
return super.onRecoverableError(context, errorId);
}
/**
* Issues a notification to inform the user that server has sent a message.
*/
@SuppressWarnings("deprecation")
private static void generateNotification(Context context, String message) {
int icon = R.drawable.icon_57x57_fixed;
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.defaults |= Notification.DEFAULT_SOUND;
notification.icon = icon;
String title = context.getString(R.string.app_name);
Intent notificationIntent = new Intent(context,
HomeScreenActivity.class);
Intent notificationIntentV2 = new Intent(context,
LoginActivity.class);
// set intent so it does not start a new activity
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
notification.flags = Notification.FLAG_AUTO_CANCEL;
PendingIntent intent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, intent);
notificationManager.notify(0, notification);
}
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0].getApplicationContext();
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}
库项目中的Manifest.xml:
<uses-permission android:name="com.myapp.libraryproject.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp.libraryproject" />
</intent-filter>
</receiver>
<service android:name="com.myapp.libraryproject.GCMIntentService" />
export Lite项目中的Manifest.xml(将库项目用作库):
<uses-permission android:name="com.myapp.liteversion.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp.liteversion" />
</intent-filter>
</receiver>
<service android:name="com.myapp.libraryproject.GCMIntentService" />
答案 0 :(得分:3)
您的问题是,com.google.android.gcm.GCMBroadcastReceiver
默认情况下会假定GCMIntentService
的位置位于您应用的主程序包中,在您的情况下为com.myapp.liteversion
。这就是为什么它找不到GCMIntentService
类的原因,实际上是com.myapp.libraryproject.GCMIntentService
。
解决方案是创建一个GCMBroadcastReceiver的子类(并在清单而不是基类中使用它),并在其中覆盖以下方法:
protected String getGCMIntentServiceClassName(Context context) {
return getDefaultIntentServiceClassName(context);
}
类似于:
protected String getGCMIntentServiceClassName(Context context) {
return GCMIntentService.class.getName();
}