web-dev-qa-db-ja.com

Androidプッシュ通知:通知をクリックすると、データを取得し、新しいアクティビティを保存して表示します

プッシュ通知機能を備えたアプリケーションを開発しています。私は次のリンクをたどりました Androidプッシュ通知

GenerateNotification()のコードを次のように変更して、URLを送信し、通知をクリックしてWebページを開くことを試みました。

/**
 * Issues a notification to inform the user that server has sent a message.
 */
private static void generateNotification(Context context, String message) {
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(R.drawable.ic_launcher, "Message received", System.currentTimeMillis());
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    //adding LED lights to notification
    notification.defaults |= Notification.DEFAULT_LIGHTS;

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(message));
    //startActivity(browserIntent);

    //PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    notification.setLatestEventInfo(context, "Message", "New message received", pendingIntent);
    notificationManager.notify(0, notification);

サーバーからのプッシュ通知を利用してデータを送信できます。今私は次のタスクを実行したい

  1. プッシュ通知を介してJSONデータを送信します。

  2. データをSQLiteデータベースに保存します。

  3. プッシュ通知をクリックして新しいアクティビティを開きます。

  4. 新しいアクティビティのプッシュ通知からのデータを表示します。

  5. アプリケーションが閉じている場合は、通知をクリックした後、アプリが起動します。

したがって、上記のタスクを実行するために実行する必要がある手順を教えてください。

3
Manoj Fegde

私は次のように問題を解決しました:

  1. プッシュ通知を介してJSONデータを送信します。 A. PHPサイズ4kbのJSONサービス)を使用してSERVERからデータを送信できます。

  2. データをSQLiteデータベースに保存します。 A. onMessage()のプッシュ通知からデータが取得されたときにSQLiteにデータを保存しました

    protected void onMessage(Context context, Intent intent) {
        Log.i(TAG, "Received message");
        String message = intent.getExtras().getString("price");
        Log.d("OnMSG",message);
    
        displayMessage(context, message);
    
        DataBaseHelper dataBaseHelper = new DataBaseHelper(context);
        dataBaseHelper.openDataBase();
        dataBaseHelper.insertData(message);
        dataBaseHelper.close();
    
        // notifies user
        generateNotification (context, message);
    }
    
  3. プッシュ通知をクリックして新しいアクティビティを開きます。 A. onMessage()から呼び出される通知関数の生成で保留中のインテントを使用してこれを行いました。

    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);
        Notification notification = new Notification(icon, message, when);
    
        String title = context.getString(R.string.app_name);
    
        Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.putExtra("ms", message);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
    
        notification.defaults |= Notification.DEFAULT_SOUND;
    
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(0, notification);     
    }
    
  4. 新しいアクティビティのプッシュ通知からのデータを表示します。 A.これは、通知をクリックすると新しいアクティビティが呼び出されたときと同じように実現されます(上記のポイント3コードから)メインアクティビティonCreate()でSQLiteからデータを取得します。

    DataBaseHelper dataBaseHelper = new DataBaseHelper(this);
    dataBaseHelper.openDataBase();
    Cursor c = dataBaseHelper.getData();
    String data = null;
    if(c.getCount()>0){
        if(c.moveToFirst()){
            do{
            data = c.getString(0);
        } while(c.moveToNext());
        }
    } else {
        data = "No Data";
    }
    
  5. アプリケーションが閉じている場合は、通知をクリックした後、アプリが起動します。 A.このタスクはポイント3から実行されます。

9
Manoj Fegde

GCMIntentService.Java

import com.google.Android.gcm.GCMBaseIntentService;
import com.google.Android.gcm.GCMRegistrar;

import Android.app.Notification;
import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.media.RingtoneManager;
import Android.net.Uri;
import Android.util.Log;
/**
 * IntentService responsible for handling GCM messages.
 */
public class GCMIntentService extends GCMBaseIntentService {

    @SuppressWarnings("hiding")
    private static final String TAG = "GCMIntentService";

    public GCMIntentService() {
        super(SENDER_ID);
    }

    @Override
    protected void onRegistered(Context context, String registrationId) {
        Log.i(TAG, "Device registered: regId = " + registrationId);
        displayMessage(context,"onregisterd");
        ServerUtilities.register(context, registrationId);
    }

    @Override
    protected void onUnregistered(Context context, String registrationId) {
        Log.i(TAG, "Device unregistered");
        displayMessage(context, "GCM unregistered");
        if (GCMRegistrar.isRegisteredOnServer(context)) {
            ServerUtilities.unregister(context, registrationId);
        } else {
            // This callback results from the call to unregister made on
            // ServerUtilities when the registration to the server failed.
            Log.i(TAG, "Ignoring unregister callback");
        }
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.i(TAG, "Received message");
        String message =intent.getExtras().getString("message");
        displayMessage(context, message);
        // notifies user
        generateNotification(context,message );
    }

    @Override
    protected void onDeletedMessages(Context context, int total) {
        Log.i(TAG, "Received deleted messages notification");
        String message = ("total deleted"+ total);
        displayMessage(context, message);
        // notifies user
        generateNotification(context, message);
    }

    @Override
    public void onError(Context context, String errorId) {
        Log.i(TAG, "Received error: " + errorId);
        displayMessage(context, ("error:"+ errorId));
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        // log message
        Log.i(TAG, "Received recoverable error: " + errorId);
        displayMessage(context, ("Recover error:"+ 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) {
        int icon = R.drawable.icon;
        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(icon, "Dear Customer , New Product has been Launched", when);
        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        notification.sound=soundUri;
        String title = context.getString(R.string.app_name);
        Intent notificationIntent = new Intent(context, lap_gcm.class);
        notificationIntent.putExtra("message", 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, PendingIntent.FLAG_CANCEL_CURRENT);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notificationManager.notify(0, notification);
    }

}

結果アクティビティ

lap_gcm.Java

import Android.app.Activity;
import Android.os.Bundle;
import Android.webkit.WebView;

public class lap_gcm extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        String message=getIntent().getStringExtra("message");
        //Here is Your message

        }
    }

あなたが言及したブログに基づくこのコードベースは、私が開発したアプリケーションの1つで使用しました。これにより、新しい通知の受信時に通知が表示され、ユーザーが通知をクリックすると新しいアクティビティが開きます。

プッシュ通知を介してすべてのデータを送信しないでください。 uデータのような小さなメッセージを送信し、サーバーからデータをプルします。メッセージがデバイスで受信されたら、それをデータベースに保存します。

2
CoolMonster

プッシュ通知を介してJSONデータを送信する

サーバー側のコードから通知メッセージのデータとしてJSONを送信できます。通知を受け取ると、メッセージにJSONが表示され、好きなことを実行できます。

データをSQLiteデータベースに保存します

これは要件に応じて簡単で、JSONで受信したデータを挿入できます。解析後、JSONからデータを取得できます。

プッシュ通知をクリックして新しいアクティビティを開きます。

あなたは以下のようにすることができます

mNotificationManager = (NotificationManager)
        this.getSystemService(Context.NOTIFICATION_SERVICE);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
        new Intent(this, YourActivity.class), 0);

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_gcm)
.setContentTitle("GCM Notification")
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(msg))
.setContentText(msg);

mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

新しいアクティビティのプッシュ通知からのデータを表示します。

プッシュメッセージから受信したデータはすべて表示できますが、JSONを解析する必要があります。

アプリケーションが閉じている場合は、通知をクリックした後、アプリが起動します。

この場合も、上記のコードが機能します。

JSON解析についてはこちらをご覧ください: http://www.vogella.com/tutorials/AndroidJSON/article.html

全体として、サーバーからGCMをプッシュし、後でJSONの解析を実行して、必要な処理を実行したときに取得するデータをサーバーコードにJSON形式で追加する必要があります。

1
Ajay S