2015-07-16 13 views
6

Zaobserwowałem kilka podobnych pytań, ale one nie mogły mi pomóc. Po wyświetleniu powiadomienia o kliknięciu użytkownika muszę wyświetlić ostatnią aktywność. Tu jest mój kodu:android Jak otworzyć ostatnią czynność po dotknięciu powiadomienia

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this) 
     .setContentTitle(getResources().getText(R.string.app_name)) 
     .setContentText(getServiceStateDescription(YourService.this)) 
     .setSmallIcon(iconId) 
     .setWhen(System.currentTimeMillis()); 

Intent nIntent = getPreviousIntent(); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(MainActivity_.class); 
stackBuilder.addNextIntent(nIntent); 
PendingIntent pendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
notificationBuilder.setContentIntent(pendingIntent); 

startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, notificationBuilder.build()); 


private Intent getPreviousIntent() { 
Intent newIntent = null; 
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    final List<ActivityManager.AppTask> recentTaskInfos = activityManager.getAppTasks(); 
    if (!recentTaskInfos.isEmpty()) { 
     for (ActivityManager.AppTask appTaskTaskInfo: recentTaskInfos) { 
      if (appTaskTaskInfo.getTaskInfo().baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) { 
       newIntent = appTaskTaskInfo.getTaskInfo().baseIntent; 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      } 
     } 
    } 
} else { 
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = activityManager.getRecentTasks(1024, 0); 
    if (!recentTaskInfos.isEmpty()) { 
     for (ActivityManager.RecentTaskInfo recentTaskInfo: recentTaskInfos) { 
      if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) { 
       newIntent = recentTaskInfo.baseIntent; 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      } 
     } 
    } 
} 
if (newIntent == null) newIntent = new Intent(); 
return newIntent; 

}

Drugi punkt jest, że jeśli użyłem przestarzałe metods w celu zbudowania powiadomienia, wyświetlanie ostatnia aktywność działa świetnie jak chciałem tutaj jest kod:

Notification note = new Notification(iconId, 
      getResources().getText(R.string.serviceStarted), 
      System.currentTimeMillis()); 
    note.flags |= Notification.FLAG_ONGOING_EVENT; 
    note.flags |= Notification.FLAG_NO_CLEAR; 

    Intent nIntent = new Intent(); 
    nIntent = getPreviousIntent(nIntent); 
    PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0); 
    note.setLatestEventInfo(this, 
      getResources().getText(R.string.app_name), getServiceStateDescription(YourService.this), pi); 

    startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, note); 

But i don't want use deprecated metods anymore, that's why i'm here explaining. Thanks in advance!

I widziałem również dokument this.

Tu jest mój manifest:

<?xml version="1.0" encoding="utf-8"?> 

<permission android:name="com.my.package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.VIBRATE"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.READ_CONTACTS"/> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="com.my.package.permission.C2D_MESSAGE" /> 
<uses-permission android:name="android.permission.GET_TASKS"/> 

<application 
    android:name=".MyApplication" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppCompat.Light"> 
    <activity android:name=".activity.StartingActivity_" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".activity.MainActivity_" 
     android:configChanges="orientation|screenSize"> 
    </activity> 
    <activity 
     android:name=".activity.ComposeEmailActivity_" 
     android:configChanges="orientation|screenSize" 
     android:parentActivityName=".activity.MainActivity_"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".activity.MainActivity_" /> 
    </activity> 
    <activity 
     android:name=".activity.EditAccountActivity_" 
     android:configChanges="orientation|screenSize" 
     android:parentActivityName=".activity.MainActivity_"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".activity.MainActivity_" /> 
    </activity>    

    <!--android:process=":remote" is for working in background--> 
    <service android:enabled="true" android:name=".service.YourService"/>  

</application> 

+0

Czy po prostu chcesz wnieść swoją aplikację na pierwszym planie w jakim stanie w jakim znajdował się, gdy poszedł do tła –

Odpowiedz

8

Twój problem nie jest z metod używasz do budowy Notification. Twoim problemem jest korzystanie z TaskStackBuilder. Korzystanie z tej klasy powoduje, że za kulisami kryje się wiele ukrytych zaklęć, a także zawiera wiele założeń dotyczących zachowania aplikacji. Niestety, te założenia są w większości błędne :-(

Jeśli chcesz po prostu przenieść swoją aplikację na pierwszy plan w jakimkolwiek stanie, w jakim się znajdowała, nie chcesz używać TaskStakBuilder, a Ty też nie chcesz . „t trzeba użyć wszystkich tych nieprzyjemnych ActivityManager metod wystarczy to zrobić?!

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this) 
    .setContentTitle(getResources().getText(R.string.app_name)) 
    .setContentText(getServiceStateDescription(YourService.this)) 
    .setSmallIcon(iconId) 
    .setWhen(System.currentTimeMillis()); 

Intent nIntent = getPackageManager(). 
     getLaunchIntentForPackage(ContextConstants.PACKAGE_NAME); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nIntent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
notificationBuilder.setContentIntent(pendingIntent); 

startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, 
    notificationBuilder.build()); 
+0

Cześć Dziękuję _ @ David Wasser_ do szybkiej odpowiedzi, ale zawsze otwiera działanie programu uruchamiającego. – nAkhmedov

+0

Również, w jaki sposób uruchamiasz aplikację po raz pierwszy? Od instalatora lub od IDE lub klikając ikonę aplikacji na ekranie HOME? –

+0

Uruchomiłem aplikację do debugowania z Android Studio. – nAkhmedov

Powiązane problemy