将推送通知接收到库项目中

时间:2014-07-14 03:39:10

标签: android push-notification android-library

我有一个项目作为库导出到我项目的精简版。 在库项目中,我实现了推送通知。我把图书馆项目作为一个普通项目,推送通知工作正常。 当我将这个项目作为精简版项目中的库导入时,我的问题就出现了。推送通知失败了。

这是我的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" /> 

1 个答案:

答案 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();
}