17

今はよくわからないことがあります。

私のメインアクティビティクラスは、TCP接続を待機する新しいスレッドを作成するサービスを作成します。入ってきたら、新しいアクティビティを開始します。

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class);
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress());
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);

その後、onCreate()そのクラスのメソッドが実行されます。2つのスレッドを作成します。1つはデータを記録して送信し、もう1つはデータを受信して​​再生します。これらのスレッドには、永久にwhileループがあります。

onCreate()何らかの理由で、その最後のクラスのが再び呼び出され、プログラムがクラッシュすることに気付きました。2つのスレッドのみが実行されており、ユーザーの操作がないため、なぜ再度呼び出されるのかわかりません。ドキュメントには、「アクティビティが最初に作成されたときに呼び出されます」と記載されています。アクティビティはすでに実行されており、作成しようとはしていません。

誰かが私にこの振る舞いを説明してもらえますか?

4

5 に答える 5

14

Androidは、特定の「デバイス構成の変更」後にアクティビティを再作成します。そのような例の1つがオリエンテーションです。詳細については、こちらをご覧ください... http://developer.android.com/guide/topics/resources/runtime-changes.html

おそらく、スレッド内の何かが、構成の変更と見なされる何かを実行していますか?

その場合は、代わりにApplicationクラスを拡張して、そこで初期化を行うと便利な場合があります。この投稿を参照してください... ローテーションAndroidでアクティビティを再開します

HTH

于 2010-11-29T01:49:35.823 に答える
6

一部のSamsungデバイスで2回呼び出されるアクティビティが発生していました。マニフェストのActivityタグにandroid:launchMode="singleInstance"を追加して解決しました。これがお役に立てば幸いです。

于 2015-07-14T13:09:56.927 に答える
1

向きの変更によってデバイスが再構成されているこの質問と同様に、次のようになります。

ローテーションAndroidでアクティビティを再開

私の好みの答え:

https://stackoverflow.com/a/11811999/3739540

onCreate()の起動を完全に停止するのではなく、イベントに渡されるBundle savedInstanceStateをチェックして、nullかどうかを確認してみてください。

たとえば、アクティビティが実際に作成されたときに実行する必要のあるロジックがある場合、すべての方向の変更ではなく、savedInstanceStateがnullの場合にのみonCreate()でそのロジックを実行します。

それ以外の場合でも、向きに合わせてレイアウトを適切に再描画する必要があります。

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_game_list);

    if(savedInstanceState == null){
        setupCloudMessaging();
    }
}
于 2019-11-16T04:10:47.990 に答える
0

これは、開発者向けオプションのアプリセクションで[アクションを保存しない]を使用したときに一度発生しました。これをオフにしていることを確認してください。

于 2013-06-06T15:47:20.850 に答える
0

インテント内の値を使用してアクティビティを開始しようとしているときに、この問題が発生しました。

以下は、Activity_AがActivity_Bを呼び出し、Activity_Bに収集されるインテントの値を渡す例です。

Intent intent = new Intent(this, activityB.class);
intent.putExtra("val1", someValue1);
intent.putExtra("val2", someValue2);
intent.putExtra("val3", someValue3);
this.StartActivity(intent);

この場合、 AndroidManifest.xmlでandroid:launchMode="singleInstance"またはandroid:launchModel="singleTop"を設定でき、Activity_Bは1回だけ起動します。お役に立てれば。

于 2017-05-22T15:41:28.967 に答える