Нажмите на уведомление, чтобы ввести мое приложение в андроид

В настоящее время я работаю над GCM (Google Cloud message), он позволяет пользователю нажимать сообщение на пользовательское устройство. И я хотел бы достичь следующего требования:

  1. Если пользователь уже ввел приложение, проигнорируйте его

  2. Если пользователь не зашел в приложение, нажмите на уведомление, чтобы войти в приложение.

И поток работы моего приложения:

  1. WelcomePage (загрузка json и создание набора данных из него) => 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, он создаст новое действие, если я на главной странице, как я могу настроить код в соответствии с моим требованием?

благодаря

Для
1. Если пользователь уже запустил приложение, проигнорируйте его:
В 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. Если пользователь не зашел в приложение, нажмите на уведомление, чтобы войти в приложение.
    Из приведенного выше кода вы узнаете, хотите ли вы возобновить приложение или запустить Splash Screen или в вашем случае WelcomeActivity.

Что касается рабочего процесса вашего приложения, я бы предложил проверить, нужно ли каждый раз загружать данные или нет. Может сохранить его, может быть, или обновить / загрузить только тогда, когда это необходимо, а остальная часть потока работает так, как есть.

В AndroidManifest.xml определите свою WelcomePageActivity с флагом android:launchMode="singleTop" . Из определения этого флага:

Новый экземпляр активности «singleTop» также может быть создан для обработки нового намерения. Однако, если целевая задача уже имеет существующий экземпляр активности в верхней части стека, этот экземпляр получит новое намерение (в вызове onNewIntent () ); Новый экземпляр не создается.

Таким образом, с этим флагом ваша деятельность не будет создана снова, скорее она получит вызов в функции onNewIntent () с помощью намерения, которое вы использовали для создания PendingIntent для уведомления. Вы можете переопределить эту функцию и использовать намерение передать новую информацию о деятельности.

Вы не сможете получать уведомления о клике, поэтому,

Попробуйте этот код:

 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

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

2.Установите это значение объекта в onPause и onResume of MainActivity, чтобы распознать, что активность запущена или нет.

 @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")); } 

Я уверен, что это поможет вам.