0

Android の学習を始めたばかりで、PC 上で実行されているサーバーとのソケット接続を使用するアプリケーションを開発しています。接続の確立に成功し、「ホーム」ボタンが押されるまで、またはOnConfigChange イベントがあります。

アプリにボタンのあるアクティビティが 1 つあります (「接続」など)。それが押されると、電話はサーバーと接続し(すべてのソケットコーディングは非UIスレッドで行われます)、接続が成功するとTextView(「ステータス」など)を「接続済み」に変更しています。そのため、電話が回転したり、ホームボタンが押されたりすると、アプリが非表示になります。アプリに戻ると、アクティビティは初期段階から開始されます。最後のセッション中に作成されたすべてのオブジェクトが破棄され、ソケット接続が失われます。

さっぱりわからない、

1.アクティビティ UI が前面に表示されるたびに再作成されるのはなぜですか?

2.ユーザーが実際に(戻るボタンを押して)終了するまで、Androidはアクティビティの状態を保存できないのはなぜですか?

3.WindowsのようにAndroidがアプリを最小化して、ユーザーが去った最後の状態に戻ることができないのはなぜですか(すべてのオブジェクトと.

4.非UIスレッドですべてのソケット操作を実行しましたが、ユーザーがホームボタンを押して(戻ることなく)離れると、このソケット接続が閉じられました。そうであれば、スレッドで使用したソケットオブジェクトをどのように保存すればよいですか最後のインスタンスの間?

5.「OnPause」中にすべての UI 変更を維持する必要があるのはなぜですか? Android自体が同じことをできないのはなぜですか?(ユーザーが去ったときにアプリの状態があり、ユーザーが戻ったときに正確なアプリケーションの状態が必要なため)、ユーザーがアプリに戻ったときに同じ状態を戻しますか?

私は開発者として 2 年間働いていますが、Android は初めてです。上記の質問に光を当ててください。

4

1 に答える 1

3

Android のアクティビティ ライフサイクルに関しては、そのメカニズムを変更するしかありません。

しかし、あなたの場合は、プロジェクトに Android アプリケーションを実装するという 1 つの解決策を提示します。

メイン アクティビティを含む新しい全体的なアプリケーションを作成します。

public class ApplicationGlobalAgent extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        MyNetwork.StartAndConnect();
    }

    @Override
    public void onTerminate()
    {
        MyNetwork.Finsish();
        super.onTerminate();
    }

    @Override
    public void onLowMemory()
    {
        //clear unused memory here
        System.gc();        
        super.onLowMemory();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        //handle any change when app is hidden, shown, restarted...
        super.onConfigurationChanged(newConfig);
    }   
}

あなたのManifiest.xml

<application 
    android:name=".ApplicationGlobalAgent"
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" >

    <activity
        android:name=".MainActivity"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
<application>

そのため、アクティビティの変更や操作に対してネットワークを維持できます。アプリケーション内のアクティビティから、次のようなアプリのメンバーを取得します。

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle pSavedInstanceState)
    {
        super.onCreate(pSavedInstanceState);

        //Access app members
        ApplicationGlobalAgent app = (ApplicationGlobalAgent)getApplication();
        app.GetMyNetwork().doDataTransport();
    }
}
于 2012-09-05T07:58:47.747 に答える