アクティビティの launchMode が singleTask に設定されている場合は、注意が必要です。

電子商取引 APP アプリケーションを開発するとき、アクティビティが複数回作成されるのを防ぐために、  Android :launchMode="singleTask" を設定します。コードは次のとおりです。

  1. <!-- メインページ -->   
  2.        <アクティビティ  
  3.            android:name= "com.sondon.mayi.activity.MainTabActivity_"  
  4.            android:label= "@string/app_name"  
  5.            android:launchMode= "シングルタスク"  
  6.           >  

開発中ずっとOKだったので油断してしまいました。

その後、umeng Push のデバッグ時に getIntent() でデータが取得できないという問題が発生し、各種デバッグや各種ログ出力ログを見ると、umeng がメッセージを処理した部分にはデータがあるものの、MainTabActivity のデータには Intent が存在しませんでした。

コードの umeng メッセージ処理部分:

  1.              /** 
  2.          ※このHandlerはBroadcastReceiver内で呼び出されるため、 
  3.          ※アクティビティを開始する必要がある場合は、Intent.FLAG_ACTIVITY_NEW_TASKを追加する必要があります 
  4.          * */  
  5.         UmengNotificationClickHandler notificationClickHandler =  new  ShoungNotificationClickHandler(){  
  6.               
  7.             @オーバーライド  
  8.             public void  launchApp( final  Context context,  Final  UMessage msg) {   
  9.                 new  Handler(getMainLooper()).post( new  Runnable() {  
  10.                     @オーバーライド  
  11.                     public void  run() {   
  12.                           
  13.                         myprefs.position().put( 1 );  
  14.                         インテントテント =  new  Intent(context,MainTabActivity_.class ) ;  
  15.                         テント.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  16.                         for  (Entry<String, String> エントリ : msg.extra.entrySet()) {  
  17.                             文字列キー = エントリ.getKey();  
  18.                             文字列値 =entry.getValue();  
  19.                              if  ( "コード" .equals(key.trim())) {  
  20.                              LogUtil.e( "Umeng...launchApp" , "key :" +key+ " value :" +value);  
  21.                              バンドル Bundle=新しい バンドル();  
  22.                              Bundle.putString( "ニュースコード" ,value);  
  23.                              インテント.putExtras(バンドル);  
  24.                              }  
  25.                         }  
  26.                         context.startActivity(意図);  
  27.                     }  
  28.                 });  
  29.             }  
  30.               
  31. //          @Override  
  32. //          public void openUrl(Context context, UMessage msg){   
  33. //              ToastUtils.show(context, msg.custom);  
  34. //              LogUtil.e("Umeng...openUrl :", msg.custom);  
  35. //          };  
  36. //            
  37. //          @Override  
  38. //          public void openActivity(Context context, UMessage msg){   
  39. //              ToastUtils.show(context, msg.custom);  
  40. //              LogUtil.e("Umeng... openActivity :", msg.custom);  
  41. //          };  
  42. //            
  43. //          @Override  
  44. //          public void dealWithCustomAction(final Context context, final UMessage msg) {   
  45. //              ToastUtils.show(context, msg.custom);  
  46. //              LogUtil.e("Umeng... dealWithCustomAction:", msg.custom);  
  47. //          }  
  48.         };  
  49.           
  50.     mPushAgent.setNotificationClickHandler(notificationClickHandler);  


折腾了很久,一直以为是umeng的问题,查了很多资料,搞了很久,最后才想起我这个activity的launchMode是singleTask,赶紧google了一下关于singleTask的资料,发现如下:


launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法


于是赶紧在我的MainTabActivity页面中添加OnNewIntent方法,方法如下:

[java]  view plain   copy
  print ?
  1. //Activity的启动模式(launchMode),通过这个方法接受Intent  
  2.     @Override  
  3.     protected void onNewIntent(Intent intent) {  
  4.         super.onNewIntent(intent);  
  5.         LogUtil.e("MainTabActivity"" onNewIntent...");  
  6.         handleIntent(intent);  
  7.     }  

google的时候又发现了这样的提醒:

不要忘记,系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法,如下所示:


觉得别人考虑的真是缜密啊,佩服,赶紧给自己代码打上补丁吧,修改如下:

[java]  view plain   copy
  print ?
  1.     //Activity的启动模式(launchMode),通过这个方法接受Intent  
  2.     @Override  
  3.     protected void onNewIntent(Intent intent) {  
  4.         super.onNewIntent(intent);  
  5.         LogUtil.e("MainTabActivity"" onNewIntent...");  
  6.         handleIntent(intent);  
  7.     }  
  8.       
  9.     @Override  
  10.     protected void onStart() {  
  11.         スーパー.onStart();  
  12.         LogUtil.e( "MainTabActivity" " onStart..." );  
  13.         ハンドルインテント(getIntent());  
  14.     }  
  15.   
  16.     /** 
  17.      * @著者蔡文峰 
  18.      * @Data_Time 2015年7月16日 午後10時37分12秒 
  19.      * @Description { ハンドルの意図 } 
  20.      * @param インテント 
  21.      */  
  22.     private void  handleIntent(Intent 意図){   
  23.         if (intent!= null ){  
  24.             String news_code=intent.getExtras().getString( "news_code" );  
  25. // LogUtil.e("MainTabActivity", "news_code :"+news_code);  
  26.             myprefs.news_code().put(news_code);  
  27.         }  
  28.     }  

以上です。その後、とても勉強になりました。基本的なことは依然として非常に重要です。めったに使用されないものもあるので、特に注意する必要があります。


おすすめ

転載: blog.csdn.net/H_shaohui/article/details/77379210