how to put the settings functionality for GCM Push Notification on/off inside the app in android?

女生的网名这么多〃 提交于 2019-12-13 00:44:26

问题


I am integrating GCM notification, this is working fine. Now i am adding toggle button of on/off notification.I stops/start service but no success. Please suggest how to manage service and receiver? my code is below.

public class GCMIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";

public GCMIntentService() {
    super("123456789123");
}

/**
 * Method called on device registered
 **/
@Override
protected void onRegistered(Context context, String registrationId) {
    Log.i(TAG, "Device registered: regId = " + registrationId); 
    ZunaCard.displayMessage(context,
            "Your device registred with GCM");
    ZunaCard.saveDeviceId(registrationId);
}

/**
 * Method called on device unRegistred
 * */
@Override
protected void onUnregistered(Context context, String registrationId) {
    Log.i(TAG, "Device unregistered");
    ZunaCard.displayMessage(context,
            "From GCM: device successfully unregistered!");
}

/**
 * Method called on Receiving a new message
 * */
@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
     String msgNotif = intent.getExtras().getString("message");
      if (!TextUtils.isEmpty(msgNotif)) {
         System.out.println("Called onMessage>>>>>>>>>>>>>>>>>"+msgNotif);
         generateNotification(context, ""+msgNotif);    
    }



}

/**
 * Method called on receiving a deleted message
 * */
@Override
protected void onDeletedMessages(Context context, int total) {
    Log.i(TAG, "Received deleted messages notification");
    String message = "From GCM: server deleted %1$d pending messages!";
    ZunaCard.displayMessage(context, message);
    // notifies user
    generateNotification(context, message);
}

/**
 * Method called on Error
 * */
@Override
public void onError(Context context, String errorId) {
    Log.i(TAG, "Received error: " + errorId);
    ZunaCard.displayMessage(context, "From GCM: error (%1$s). "
            + errorId);
}

@Override
protected boolean onRecoverableError(Context context, String errorId) {
    // log message
    Log.i(TAG, "Received recoverable error: " + errorId);
    ZunaCard.displayMessage(context,
            "From GCM: recoverable error (%1$s). " + errorId);
    return super.onRecoverableError(context, errorId);
}

/**
 * Issues a notification to inform the user that server has sent a message.
 */
private static void generateNotification(Context context, String message) {

    System.out.println("Called generateNotification>>>>>>>>>>>>>"+message);
    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    // Notification notification = new Notification(icon, message, when);

    String title = context.getString(R.string.app_name);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            context)
            .setSmallIcon(R.drawable.app_icon)
            .setContentTitle(title)

            .setStyle(
                    new NotificationCompat.BigTextStyle().bigText(message))
            .setContentText(message);

    Intent notificationIntent = new Intent(context,
            SplashActivity.class);
    PendingIntent intent = PendingIntent.getActivity(context, 0,
            notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

    mBuilder.setContentIntent(intent);

    Notification notification = mBuilder.build();
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notification.defaults |= Notification.DEFAULT_SOUND;
    notification.defaults |= Notification.DEFAULT_VIBRATE;  
    notificationManager.notify(0, notification);

}}

and receiver code:

public class GCMReceiver extends GCMBroadcastReceiver {
@Override
protected String getGCMIntentServiceClassName(Context context) {
    return context.getString(R.string.gcm_service_class);
}}

回答1:


I would use this to Unregister the GCM service and Receiver:

public static void unregisterGCMComponents(Context context)
{
    int flag = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;

    ComponentName component1 = new ComponentName(context, GCMIntentService.class);
    context.getPackageManager().setComponentEnabledSetting(component1, flag,    PackageManager.DONT_KILL_APP);

    ComponentName component2 = new ComponentName(context, GCMBroadcastReceiver.class);
    context.getPackageManager().setComponentEnabledSetting(component2, flag, PackageManager.DONT_KILL_APP);
}

So, you can call this method from your launcher class or "Application" class like this :

if(!notification_flag) //push is set to ON
    unregisterGCMComponents(this);



回答2:


There are two way to achieve.


  1. you can Unregistered key from GCM.
  2. you can remove device token from server via using service in case of OFF Notification from application.

Hop this will give idea.



来源:https://stackoverflow.com/questions/25683785/how-to-put-the-settings-functionality-for-gcm-push-notification-on-off-inside-th

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!