2011-12-23 8 views
5

私はアンドロイド4.0.3(アイスクリームサンドイッチ)でアプリを開発しました。私はアクティビティナビゲーションをテストするために2つのアクティビティを使用しています。しかし、私はアクティビティナビゲーションでは異なる動作を観察しました。これはAndroid 4.0の新しい実装ですか?

私はアクティビティBをアクティビティAから呼び出しています。アクティビティBでは、単にfinish()メソッドを呼び出しています。前のアクティビティAを見ることができるようになりました。これは正常に動作していますが、問題はバックナビゲーション(コール終了メソッドまたはバックキーの押下)であり、onResumeを呼び出す代わりにonCreate()メソッドAを呼び出しています)。しかし、以前のバージョンでは、このように動作していません。これはアンドロイド4.0の新しい実装ですか?ここで

iが実装例です。

Activity_A:

public class Activity_A extends Activity { 

    /** Called when the activity is first created. */ 
    static int count=0; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView text=(TextView)findViewById(R.id.textcontent); 
     text.setText("Activity 1 called:"+(++count)+" Times"); 
    } 

    public void onClick(View v) 
    { 
     Intent intent=new Intent(this,Activity2.class); 
     startActivityForResult(intent, 1); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d("onActivityResult", "Called with Code:"+resultCode); 
    } 

} 

Activity_B:

public class Activity_B extends Activity { 

     /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView text=(TextView)findViewById(R.id.textcontent); 
     text.setText("Activity 2"); 
    } 

    public void onClick(View v) 
    { 
     setResult(1); 
     finish(); 
    } 
} 

チェックして、私はどんな間違いをしていた場合、私に知らせてください。

ありがとう、 Ram。

+0

質問:onResumeはonCreateの後に来ますか?私はアクティビティAをアクティビティBと呼んだ後にAndroidによって落としたと思います。これは私が思うすべてのAndroidプラットフォームで発生する可能性があります。 –

答えて

1

これは、Androidアクティビティドキュメント(Link here)からのものである:(スタックの最上部の)スクリーンの前景における活性は、それがアクティブまたは実行中である

  • 場合。
  • アクティビティのフォーカスが失われても表示されている場合(つまり、フルサイズでないまたは透過的でない新しいアクティビティがアクティビティの上にフォーカスしている場合)、アクティビティは一時停止します。一時停止したアクティビティは完全に生きています(すべての状態とメンバの情報を保持し、ウィンドウマネージャに接続された状態のままです)が、極端にメモリが少ない状況ではシステムによって強制終了されます。
  • アクティビティが別のアクティビティによって完全に隠されている場合、そのアクティビティは停止します。それでも、すべての状態とメンバの情報は保持されますが、ユーザには表示されなくなり、そのウィンドウは隠され、メモリが必要なときにシステムによって殺されることがよくあります。
  • アクティビティが一時停止または停止している場合、システムはアクティビティの終了を要求するか、単にプロセスを終了することによって、アクティビティをメモリから削除できます。再度ユーザーに表示されるときは、完全に再開して元の状態に戻す必要があります。

おそらく3と4の点が関連します。

+0

しかし、それはちょうど約2つの活動です。それ以上の私のデバイス(サムスンNexus S)に4.0.3に更新した後、最初のサードパーティーのアプリです、それはどのように低メモリの問題? – ram

+0

アクティビティ図から、アクティビティが古いアクティビティを隠す場合、アクティビティは停止します。システムがメモリを必要としない場合は、onResumeではなくonRestartを呼び出します。あなたのプログラムがどこから始まったのでしょうか?システムがメモリを必要としない限り、onStopからonCreateに行くことに関するアイスクリームの変更については言及していません。 – Davos555

+0

OKありがとうございます。 – ram

7

私は同じ問題を抱えています! [設定/開発]に移動し、[アクティビティを破棄する]チェックボックスをオフにします。

+0

**注**: - 効果を確認するには、電話を再起動する必要があります。 – Deepak

+0

画像をキャプチャまたはキャンセルする前にonActivityResultメソッドをアンドロイド4.03でキャプチャするためにカメラを開くと、結果コードが常にnullになり、onActivityResultで画像キャプチャイベントを処理できませんでした。なぜこのようなことが起こったのか考えていますか?私はこれをhtc me 4.03でテストしていますが、これはi-tab intext 4.04バージョンでも動作します。 –

0

アクティビティの状態を維持するには、onSavedInstanceState()メソッドとonRestoreInstanceSate()メソッドを使用します。

0

この回答を見るhttps://stackoverflow.com/a/16147110/1306419 私はそこから引用します:

アクティビティA(親アクティビティ)の起動モードをandroid:launchMode="singleTop"として宣言する必要があります。AndroidManifest.xml。あなたがそれをしないと、Androidは標準起動モードを使用します。つまり、The system always creates a new instance of the activity in the target task.を意味し、アクティビティは再作成されます(Android documentation)。

singleTopの場合、タスクのバックスタックの最上部にある場合、システムは既存のアクティビティ(元の余分なもの)に戻ります。

関連する問題