点击通知在Android中input我的应用程序

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

  1. 如果用户已经进入应用程序,忽略它

  2. 如果用户没有进入该应用程序,点击通知进入该应用程序

而我的应用程序的工作stream程是:

  1. WelcomePage(下载json并从中创build数据集)=> MainPage(根据数据集显示)

处理通知的代码

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类,它将创build一个新的活动,如果我在主页面,我怎样才能调整代码,以适应我的要求?

谢谢

Solutions Collecting From Web of "点击通知在Android中input我的应用程序"

对于
1.如果用户已经进入应用程序,忽略它:
onReceive() ,检查你的app是否在运行,不要通知。
它可以用类似的东西来检查:

 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。

关于你的应用程序的工作stream程,我build议检查你是否需要每次都下载数据。 可以保存它,也可以只在需要的时候更新/下载,剩下的stream程照原样运行。

在您的AndroidManifest.xml ,使用android:launchMode="singleTop"标志定义android:launchMode="singleTop" 。 从这个标志的定义 :

也可以创build一个“singleTop”活动的新实例来处理新的意图。 但是,如果目标任务已经在其堆栈顶部存在一个活动的现有实例,那么该实例将接收新的目标(在onNewIntent()调用中)。 一个新的实例不会被创build。

因此,使用此标志,您的活动将不会再次创build,而是使用您用于为通知创buildPendingIntent的Intent在onNewIntent()函数中接收调用。 您可以重写此函数,并使用意图传递活动的新信息。

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

试试这个代码:

 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. } } 

}

1.在GcmIntentService中创build一个对象

 public static final Object CURRENTACTIVIYLOCK = new Object(); //for storing current activity public static Activity currentActivity; 

2.在MainActivity的onPause和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")); } 

我相信这会帮助你。