点击通知在android中输入我的应用程序

时间:2014-02-27 03:27:36

标签: android android-intent notifications push-notification android-notifications

目前我正在开发GCM(Google Cloud消息),它允许用户将消息推送到用户设备。我想达到以下要求:

  1. 如果用户已输入应用,请将其忽略

  2. 如果用户未输入应用,请点击通知进入应用

  3. 我的应用程序的工作流程是:

    1. WelcomePage(从中下载json并创建数据集)=> MainPage(基于数据集显示)
    2. 处理通知的代码

      private void sendNotification(String msg) {
              mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
              String notifyMsg = "";
              JSONTokener tokener = new JSONTokener(msg);
      
              if (tokener != null) {
                  try {
                      notifyMsg = new JSONObject(tokener).getString("msg");
                  } catch (JSONException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
      
              Intent myintent = new Intent(this, WelcomePageActivity.class);
              myintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
              PendingIntent contentIntent = PendingIntent.getActivity(this, 0, myintent, PendingIntent.FLAG_UPDATE_CURRENT);
      
              NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
              .setSmallIcon(R.drawable.ic_launcher)
              .setContentTitle(getResources().getString(R.string.notification_title))
              .setStyle(new NotificationCompat.BigTextStyle()
              .bigText(notifyMsg))
              .setContentText(notifyMsg)
              .setContentIntent(contentIntent);
      
              mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
          }
      

      问题是如果我使用WelcomePageActivity类,如果我在主页面它将创建一个新活动,我如何调整代码以满足我的要求?

      谢谢

4 个答案:

答案 0 :(得分:5)

AndroidManifest.xml中,使用标记android:launchMode="singleTop"定义WelcomePageActivity。从这个标志的definition开始:

  

也可以创建“singleTop”活动的新实例来处理   一个新的意图。但是,如果目标任务已经存在   在其堆栈顶部的活动的实例,该实例将   收到新意图(在onNewIntent()电话中);一个新的实例是   没有创建。

因此,使用此标志,您的活动将不会再次创建,而是会在onNewIntent()函数中接收一个调用,其中包含您用于为通知创建PendingIntent的Intent。您可以覆盖此功能,并使用intent传递活动新信息。

答案 1 :(得分:5)

有关
 1.如果用户已经输入app,请忽略它:
onReceive()中,检查您的应用是否正在运行,请勿通知 可以通过以下方式检查:

ActivityManager activityManager =(ActivityManager)gpsService.this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> serviceList= activityManager.getRunningServices(Integer.MAX_VALUE);

if((serviceList.size() > 0)) {
    boolean found = false;

    for(int i = 0; i < serviceList.size(); i++) {
        RunningServiceInfo serviceInfo = serviceList.get(i);
        ComponentName serviceName = serviceInfo.service;

        if(serviceName.getClassName().equals("Packagename.ActivityOrServiceName")) {
            //Your service or activity is running
            break;
        }
    }  
  1. 如果用户尚未进入应用程序,请单击通知以进入应用程序
    从上面的代码中,您知道是否要恢复应用程序或启动 - 调用启动画面或您的情况WelcomeActivity。
  2. 关于您的应用的工作流程,我建议您检查是否需要每次都下载数据。可以保存它或仅在需要时更新/下载,其余流程按原样工作。

答案 2 :(得分:2)

您将无法收到任何通知点击事件,

试试这段代码:

Intent myintent = new Intent(this, TestActivity.class);
    myintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, myintent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.ic_launcher)
    .setContentTitle(getResources().getString(R.string.notification_title))
    .setStyle(new NotificationCompat.BigTextStyle()
    .bigText(notifyMsg))
    .setContentText(notifyMsg)
    .setContentIntent(contentIntent);

    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

public class TestActivity  extends Activity{

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

    // check for your app state is running or not
    if(appRunning == false) {
        // start your WelcomePage activity.
    }
}

}

答案 3 :(得分:1)

1.在GcmIntentService

中创建一个对象
public static final Object CURRENTACTIVIYLOCK = new Object();
  //for storing current activity
    public static Activity currentActivity;

2.在onAause和MainActivity的onResume中更新此对象值,以识别Activity是否正在运行。

@Override
public void onResume() {
    super.onResume();
    System.out.println("onResume Home page");
    synchronized (GcmIntentService.CURRENTACTIVIYLOCK) {
        GcmIntentService.currentActivity = this;
    }
}

@Override
public void onPause() {
    super.onPause();

    synchronized (GcmIntentService.CURRENTACTIVIYLOCK) {
        GcmIntentService.currentActivity = null;
    }
}

3.在GcmIntentService类中,检查onHandleIntent方法中的当前活动。

synchronized (CURRENTACTIVIYLOCK) {
if (currentActivity != null) {
    if (currentActivity.getClass() == HomePageActivity.class) {

    } else {
        sendNotification(extras.getString("message"));
    }
} else {
        sendNotification(extras.getString("message"));
}

我相信这会对你有帮助。