活动不显示数据当我点击通知时

时间:2012-11-16 19:09:05

标签: android push-notification

我正在使用android推送通知的示例代码,该代码包含在android sdk文件夹中。 我遇到的问题是,当我点击通知栏中的通知时它显示一个空白活动,我也尝试使用显示提醒对话,但如果我在活动中,那么它将显示消息(在TextView中)和警报对话也不会。我该怎么做才能显示信息。我只想在点击通知时显示提醒对话框。

GCMIntentService.java

package com.example.testgcm;

import static com.example.testgcm.CommonUtilities.SENDER_ID;
import static com.example.testgcm.CommonUtilities.displayMessage;

import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;
import com.google.android.gcm.GCMBaseIntentService;


public class GCMIntentService extends GCMBaseIntentService{

    public GCMIntentService()
    {
        super(SENDER_ID);
    }

    @Override
    public void onRegistered(Context context, String regId)
    {
        Log.i(TAG, "Device registered: regId = " + regId);
        String msg="Your device registred with GCM"+regId;
        //displayMessage(context, msg);
        /*Log.d("NAME", MainActivity.name);
        Server.register(context, MainActivity.name, regId);*/

    }

    @Override
    public void onUnregistered(Context context, String regId)
    { 
        Log.i(TAG, "Device unregistered");
        displayMessage(context, getString(R.string.gcm_unregistered));
        Server.unregister(context, regId);
    }

    @Override
    public void onMessage(Context context, Intent intent)
    {
        String message = intent.getExtras().getString("message");
        Log.i(TAG, "Received message");
        Log.i("Message: ", message);

        displayMessage(context, message);

        // notifies user
        generateNotification(context, message);
    }

    @Override
    protected void onError(Context context, String errorMsg) {
        Log.i(TAG, "Received error: " + errorMsg);
        displayMessage(context, getString(R.string.gcm_error, errorMsg));

    }

    @Override
    protected boolean onRecoverableError(Context context, String errorMsg) {
        Log.i(TAG, "Received recoverable error: " + errorMsg);
        displayMessage(context, getString(R.string.gcm_recoverable_error,errorMsg));
        return super.onRecoverableError(context, errorMsg);
    }

     @SuppressWarnings("deprecation")
    private static void generateNotification(Context context, String message) {
            int icon = R.drawable.ic_launcher;
            long when = System.currentTimeMillis();
            NotificationManager notificationManager = (NotificationManager)
                    context.getSystemService(Context.NOTIFICATION_SERVICE);
            @SuppressWarnings("deprecation")
            Notification notification = new Notification(icon, message, when);

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

            Intent notificationIntent = new Intent(context, MainActivity.class);
            notificationIntent.putExtra("NEW", message);
            // set intent so it does not start a new activity
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);

            PendingIntent intent =
                    PendingIntent.getActivity(context, 0, notificationIntent, 0);
            notification.setLatestEventInfo(context, title, message, intent);
            notification.flags |= Notification.FLAG_AUTO_CANCEL;

            // Play default notification sound
            notification.defaults |= Notification.DEFAULT_SOUND;

            // Vibrate if vibrate is enabled
            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notificationManager.notify(0, notification);     
        }

}

MainActivity.java

package com.example.testgcm;

import static com.example.testgcm.CommonUtilities.DISPLAY_MESSAGE_ACTION;
import static com.example.testgcm.CommonUtilities.EXTRA_MESSAGE;
import static com.example.testgcm.CommonUtilities.SENDER_ID;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gcm.GCMRegistrar;



public class MainActivity extends Activity {

    AsyncTask<Void, Void, Void> mRegisterTask;
    TextView mDisplay;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mDisplay = (TextView) findViewById(R.id.display);

        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);

        registerReceiver(mHandleMessageReceiver, new IntentFilter(
                DISPLAY_MESSAGE_ACTION));

        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) 
        {
            GCMRegistrar.register(this, SENDER_ID);
            String rid=GCMRegistrar.getRegistrationId(this);
            Log.e("Registration ID: ", rid);
            Toast.makeText(getApplicationContext(), "Registration ID: " + rid, Toast.LENGTH_LONG).show();
            mDisplay.append("Registration ID: " + regId);
        } 
        else 
        {
            if (GCMRegistrar.isRegisteredOnServer(this)) 
            {
                Log.v(getClass().getSimpleName(), "Already registered");
                Log.e("Registration ID: ", regId);
                Toast.makeText(getApplicationContext(), "Registration ID: " + regId, Toast.LENGTH_LONG).show();
                mDisplay.append("Registration ID: \n" + regId);
            }
            else
            {
                final Context context = this;
                mRegisterTask = new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... arg0) {
                        // TODO Auto-generated method stub

                        //   Server.register(context, name,  regId);

                        return null;
                    }
                    @Override
                    protected void onPostExecute(Void result) {
                        mRegisterTask = null;
                    }   
                };
                mRegisterTask.execute(null, null, null);
            }
        }
    }

    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);

            String message = intent.getExtras().getString("NEW");
            // Waking up mobile if it is sleeping
            WakeLocker.acquire(getApplicationContext());

            // Showing received message
            mDisplay.append(newMessage + "\n");
        //  Toast.makeText(getApplicationContext(), newMessage, Toast.LENGTH_LONG).show();
            displayAlert(newMessage);
            //  displayAlert( newMessage);

            // Releasing wake lock
            WakeLocker.release();
        }
    };

    @Override
    protected void onDestroy() {
        if (mRegisterTask != null) {
            mRegisterTask.cancel(true);
        }
        try {
            unregisterReceiver(mHandleMessageReceiver);
            GCMRegistrar.onDestroy(this);
        } catch (Exception e) {
            Log.e("UnRegister Receiver Error", "> " + e.getMessage());
        }
        super.onDestroy();
    }

    private void displayAlert(String message)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(message).setCancelable(
                false).setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                }).setNegativeButton("No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }
}

CommonUtilities.java

package com.example.testgcm;

import android.content.Context;
import android.content.Intent;

public class CommonUtilities {

    static final String SERVER_URL = "http://10.0.2.2/api/Product?";

    // Google project id
    static final String SENDER_ID = "xxxxxxxxxxxxx"; 

    static final String TAG = "Test App";

    static final String DISPLAY_MESSAGE_ACTION =
            "com.example.testgcm.DISPLAY_MESSAGE";

    static final String EXTRA_MESSAGE = "message";

    static void displayMessage(Context context, String message) {
        Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
        intent.putExtra(EXTRA_MESSAGE, message);
        context.sendBroadcast(intent);
    }
}

2 个答案:

答案 0 :(得分:0)

问题是发送消息广播意图的代码段会在通知到达时执行,但不会在用户打开通知时执行。

@Override
public void onMessage(Context context, Intent intent)
{
    String message = intent.getExtras().getString("message");
    Log.i(TAG, "Received message");
    Log.i("Message: ", message);

    displayMessage(context, message);

    // notifies user
    generateNotification(context, message);
}

在执行displayMessage(context,message)时,没有BroadcastListener来捕获你的消息事件。

但是,如果用户打开了活动,则会显示另一个通知,因为您已在活动上下文中注册了监听器。

您应该将消息设置为TextView和MainActivity.onCreate或MainActivity.onResume方法,考虑到您此时已经有“MSG”额外消息。每次收到新通知时,请让broadcaste接收器更新活动textview。

答案 1 :(得分:0)

检查您是否已在*.java test eol=lf

中声明了该活动
相关问题