2016-07-13 2 views
1

Я пытаюсь возобновить свою деятельность из уведомления, но это воссоздает деятельность, а не возобновляет ее.Возобновление деятельности извещения, вызывающего onCreate

Как и все сообщения, относящиеся к этой проблеме, укажите создание PendingIntent и установку этого с соответствующими флагами (как показано ниже) и добавление singleTop|singleInstance в AndroidManifest.

Уведомление Код:

NotificationManager mNotifyMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     mNotifyMan.cancelAll(); 
     Notification.Builder mNB = new Notification.Builder(this); 
     mNB.setOngoing(true); 
     Intent intent = new Intent(parentContext, main.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
     PendingIntent pendingIntent = PendingIntent.getActivity(parentContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     mNB.setContentIntent(pendingIntent); 
     mNB.setSmallIcon(R.drawable.ic_notify_icon); 
     mNB.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_noti_large)); 
     mNB.setContentTitle(Title); 
     mNB.setContentText(Message); 
     mNB.setColor(0); 
     mNotifyMan.notify(777, mNB.build()); 

Я понимаю, один должен пройти умысел с текущим контекстом.

При возобновлении действия через onPause() по адресу onResume() он возобновляет и восстанавливает последнее состояние активности, то есть работающий счетчик потоков имеет увеличенные значения.

Проблема:

При возобновлении уведомления (т.е. щелкающего по уведомлению), активность воссоздана. Я попытался разрешить это с помощью

, когда onPause() выполняется, отправив текущее состояние активности через базовый класс в уведомление, тем самым воссоздавая уведомление с текущим состоянием.

Вот мой AndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cynetstudios.wifimanager"> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-feature android:name="android.hardware.wifi" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:launchMode="singleInstance"> 

     <activity android:name="com.cynetstudios.frequencyselector.main" android:configChanges="orientation|screenSize|keyboardHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/> 
    </application> 

</manifest> 

я мог бы что-то не хватает тривиальной, любой совет?

+0

Использование режима запуска singleInstance не является правильным способом справиться с этим. Это сильно повредит ваше приложение, если ваше приложение имеет более 1 «Активность». Вы должны посмотреть http://stackoverflow.com/questions/5502427/resume-application-and-stack-from-notification/5502950#5502950 –

ответ

2

Вы можете настроить данный вид деятельности launchModeSingleTask, SingleTop или SingleInstance в зависимости от того, как вы хотите, чтобы ваша деятельность действовала.

Позже вы можете обработать метод onNewIntent вашей деятельности, если ваша активность открыта, когда пользователь нажимает на ваше активное уведомление.

Также вам нужно определить действие launchMode в этой части atcitvity. Я отредактировал ваш xml.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cynetstudios.wifimanager"> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-feature android:name="android.hardware.wifi" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity android:name="com.cynetstudios.frequencyselector.main" 
      android:configChanges="orientation|screenSize|keyboardHidden" 
      android:launchMode="singleInstance"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/> 
    </application> 

</manifest> 

Надеюсь, это поможет вам.

1

launchMode следует использовать в разделе активности (не приложения)

+0

спасибо, попробуем – KGCybeX

+0

спасибо, руководство, которое я последовал, показало launchMode в теге приложения , это работает, спасибо – KGCybeX

0

Попробуйте

Intent.FLAG_ACTIVITY_CLEAR_TOP

с

Intent.FLAG_ACTIVITY_NEW_TASK

Установите их в качестве флагов для намерения

+0

согласно документам, CLEAR_TOP очищает все действия до тех пор, пока это не будет, таким образом доведя его до вершины – KGCybeX

+0

Это означает, что он не запустит новый экземпляр действия – ammcom

0

Попробуйте это может помочь вам:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

и, как говорит @Alexander поставить андроида: launchMode = «SingleTop» в тег активности

0
Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
intent.setClass(this, main.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
startActivity(intent); 

Вы можете попробовать это намерение. Такое намерение используется приложением запуска системы, которое просто покажет (не воссоздает) вашу деятельность, если она не будет убита.

Смежные вопросы