2014-01-26 3 views
0

Ниже приведен мой код, который настраивает панель уведомлений.Нажимает ли панель уведомлений создать новое действие?

PendingIntent pi = PendingIntent.getActivity(
    getApplicationContext(), 
    0, 
    new Intent(getApplicationContext(), AudioActivity.class), 
    PendingIntent.FLAG_UPDATE_CURRENT 
); 
NotificationCompat.Builder builder = 
    new NotificationCompat.Builder(this) 
    .setSmallIcon(R.drawable.ic_action_star) 
    .setContentTitle("My app") 
    .setContentText("works") 
    .setContentIntent(pi); 
mNotificationManager = (NotificationManager) getSystemService(
    Context.NOTIFICATION_SERVICE 
); 
mNotificationManager.notify(NOTIFICATION_ID, builder.build()); 

Во время выполнения, я первый показать AudioActivity на переднем месте, а затем открыть панель уведомлений, которая показывает сообщение, как «Мои приложение работает». При нажатии на сообщение снова открывается AudioActivity.

Но кажется, что система вызывает метод onCreate AudioActivity, когда я нажимаю панель уведомлений. И до этого он не вызывает onDestroy существующего AudioActivity. Мне было интересно, есть ли у меня два экземпляра AudioActivity, и как я могу ими управлять. Я ожидал, что это должно было сработать с тем, как действия переключаются, а onStart используется скорее onCreate.

Спасибо.

ответ

1

Лучшее решение для Вас, чтобы сделать его называют onNewIntent и использовать повторно существующую деятельность

В вызываемой деятельности:

@Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     if ("action.action.myactionstring".equals(intent.getAction())) { 
      finish(); 
     } 
    } 

В призванной деятельности MainFest въездного

<activity android:name=".MyNotifiedActivity" > 
     <intent-filter> 
      <action android:name="action.action.myactionstring" /> 
      ... 
     </intent-filter> 
    </activity> 

Когда создание ожидающего намерения

Intent myIntent = new Intent("action string"); 
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent pi = PendingIntent.getActivity(
    getApplicationContext(), 
    0, 
    myIntent, 
    PendingIntent.FLAG_UPDATE_CURRENT 
); 

Флаг Intent.FLAG_ACTIVITY_SINGLE_TOP указывает андроиду повторно использовать существующий экземпляр действия (если он существует). onNewIntent вызывается вместо onCreate, если он еще не запущен, он вызывает onCreate как обычно

+0

В моем коде я заменил новый Intent (getApplicationContext(), AudioActivity.class) на новый Intent («строка действия») и добавил этот фильтр намерений, затем он работает, и он не вызывает onCreate снова. Но я также обнаружил, что он не вызывает onNewIntent. –

+0

Что здесь делает work.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP)? –

+1

«Строка действия» должна соответствовать определенному фильтру намерения, который вы зарегистрировали в манифесте (или в коде), правильно ли вы настроили его? Если вы хотите опубликовать биты, которые у вас есть, которые соответствуют моему примеру, я посмотрю –

0

@Nick Cardoso: Вот измененный код. Я думаю, что он работает так, как будто он не вызывает onCreate. Я просто задавался вопросом, почему он не вызывает onNewIntent, как вы ожидали. Благодарю.

PendingIntent pi = PendingIntent.getActivity(
     getApplicationContext(), 
     0, 
     new Intent("com.example.myapp.ACTION_NOTIFICATION"), 
     PendingIntent.FLAG_UPDATE_CURRENT 
    ); 
    NotificationCompat.Builder builder = 
     new NotificationCompat.Builder(this) 
     .setSmallIcon(R.drawable.ic_action_star) 
     .setContentTitle("My app") 
     .setContentText("works") 
     .setContentIntent(pi); 
    mNotificationManager = (NotificationManager) getSystemService(
     Context.NOTIFICATION_SERVICE 
    ); 
    mNotificationManager.notify(NOTIFICATION_ID, builder.build()); 



<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.ourradio.AudioActivity" 
     android:label="@string/title_activity_audio" 
     android:parentActivityName="com.example.ourradio.FeedActivity" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.ourradio.FeedActivity" /> 
     <intent-filter> 
     <action 
     android:name="com.example.myapp.ACTION_NOTIFICATION" /> 
     </intent-filter> 
    </activity> 
    <service 
     android:name="com.example.ourradio.AudioService" 
     android:label="@string/label_service_audio" > 
    </service> 
</application> 
+1

Так как вам также нужно добавить категорию по умолчанию к фильтру намерения в манифесте .PLease отметьте мой предыдущий ответ как принятый, увидев, как он помог ты, спасибо –

0

@Joe C, более простое решение, возможно, добавить флаг SINGLE_TOP в androidManifest как launchMode в деятельности, как это:

<activity 
    android:name="com.example.ourradio.AudioActivity" 
    android:label="@string/title_activity_audio" 
    android:parentActivityName="com.example.ourradio.FeedActivity" 
    android:launchMode="singleTop"> 
    <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

вы можете увидеть по этой ссылке для получения дополнительной информации: http://www.intridea.com/blog/2011/6/16/android-understanding-activity-launchmode

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