2015-07-16 12 views
6

Ho osservato diverse domande simili ma non potevano aiutarmi. Devo visualizzare l'ultima attività quando la notifica del clic dell'utente. Qui è il mio codice:android Come aprire l'ultima attività quando si tocca la notifica

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; 

}

Secondo punto è che se ho usato deprecato metods al fine di costruire la notifica, la visualizzazione di ultima attività le grandi opere come ho voluto Ecco il codice:

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!

E ho visto anche this doc.

Ecco il mio manifesto:

<?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

vuoi solo per portare l'applicazione in primo piano in qualsiasi stato in cui era quando è andato allo sfondo –

risposta

8

Il tuo problema non è con i metodi in uso per costruire la Notification. Il tuo problema è il tuo uso di TaskStackBuilder. L'uso di questa classe comporta un sacco di magia nascosta dietro le quinte e fa un sacco di presupposti su come si desidera che l'app si comporti. Purtroppo, queste supposizioni sono per lo più sbagliate :-(

Se si desidera portare la propria applicazione in primo piano in qualsiasi stato si trovasse quando è passato allo sfondo, non si desidera utilizzare TaskStakBuilder e si don anche . 't devono utilizzare tutte quelle brutte ActivityManager metodi solo fare questo:?!

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

Hi Grazie _ @ David Wasser_ per rispondere rapidamente, ma apre sempre l'attività di avvio – nAkhmedov

+0

Inoltre, come si avvia l'app per la prima volta? Dall'installer o da un IDE o facendo clic sull'icona dell'app dalla schermata HOME? –

+0

Ho lanciato debug apk da Android Studio. – nAkhmedov

Problemi correlati