4

假设我的应用程序已启动并正在运行。然后我转到我的设备主屏幕。导航到设置>>应用程序>>管理应用程序,选择我的应用程序,然后按Force stop

Activity下次打开应用程序时会调用哪个方法?在我因不检查自己而受到攻击之前,我的,和方法Log中有许多语句,但实际上在重新打开应用程序时它们都没有显示。onCreateonStartonResumeLogCat

如果您知道Force stop我的应用程序所处状态的答案,但缺少的Log陈述没有意义,请分享。Force stop我认为除了我错过了我的程序放置在哪里之外,可能还有一个不同的问题。

Android 活动生命周期: 在此处输入图像描述

onCreate()

public void onCreate(Bundle savedInstanceState) {
    Log.i( TAG, "Whats going onnnn0" );
    // This calls all inherited methods, as this is a subclass of Activity.
    super.onCreate(savedInstanceState);
    if(D) Log.e(TAG, "+++ ON CREATE +++");
    Log.i( TAG, "Whats going onnnn" );


    // Set the view the main.xml
    setContentView(R.layout.main);
    RelayAPIModel.bluetoothConnected = false;
    // Initialize the connection.
    setupConnection();
    Log.i( TAG, "Whats going onnnn2" );

    // Check how if bluetooth is enabled on this device.
    mService.checkBluetoothState();
    // Initialize stuff from PilotMain() method
    initMain();
    Log.i( TAG, "Whats going onnnn3" );
    // Add listeners to all of the buttons described in main.xml
    buildButtons();
    Log.i( "HERE", "HERE" );
    // If the adapter is null, then Bluetooth is not supported
    if (mService.getAdapter() == null) {
        Toast.makeText(this, R.string.toast_bt_not_avail, Toast.LENGTH_LONG).show();
        finish();
        return;
    }
    savedStuff = (SerializableObjects)LocalObjects.readObjectFromFile( getApplicationContext(), "LastDevice.txt" );
    if( savedStuff != null ) {
        hasLastDevice = true;
        Log.i( "HAS", "LAST DEVICE" );
        Log.i( "HAS", savedStuff.getName() );
    } else {
        hasLastDevice = false;
        Log.i( "HAS NO", "LAST DEVICE" );
    }

    pairedDeviceList = new ArrayList<BluetoothDevice>();
    pairedDevices = mService.getAdapter().getBondedDevices();

    for( BluetoothDevice device: pairedDevices ) {
        pairedDeviceList.add( device );
    }
    if( hasLastDevice ) {
        for( int i = 0; i < pairedDeviceList.size(); i++ ) {
            Log.i( "1 HERE HERE", pairedDeviceList.get( i ).getName() );
            Log.i( "1 HEUH?I@JD", savedStuff.getName() );
            if( pairedDeviceList.get( i ).getName().equals( savedStuff.getRealName() ) ) {
                // THIS IS THE DEVICE WE NEED
                previousDevice = pairedDeviceList.get( i );
                i = pairedDeviceList.size();
            }
        }
    }

} 

开始()

public void onStart() {
    super.onStart();
    if(D) Log.e(TAG, "++ ON START ++");

    savedStuff = (SerializableObjects)LocalObjects.readObjectFromFile( getApplicationContext(), "LastDevice.txt" );
    if( savedStuff != null ) {
        hasLastDevice = true;
        Log.i( "HAS", "LAST DEVICE" );
        Log.i( "HAS", savedStuff.getName() );
    } else {
        hasLastDevice = false;
        Log.i( "HAS NO", "LAST DEVICE" );
    }

    pairedDeviceList = new ArrayList<BluetoothDevice>();
    pairedDevices = mService.getAdapter().getBondedDevices();

    for( BluetoothDevice device: pairedDevices ) {
        pairedDeviceList.add( device );
    }
    if( hasLastDevice ) {
        for( int i = 0; i < pairedDeviceList.size(); i++ ) {
            Log.i( "2 HERE HERE", pairedDeviceList.get( i ).getName() );
            Log.i( "2 HEUH?I@JD", savedStuff.getName() );
            if( pairedDeviceList.get( i ).getName().equals( savedStuff.getRealName() ) ) {
                // THIS IS THE DEVICE WE NEED
                previousDevice = pairedDeviceList.get( i );
                i = pairedDeviceList.size();
            }
        }
    }


    // If BT is not on, request that it be enabled.
    // setupChat() will then be called during onActivityResult
    if (!mService.getAdapter().isEnabled()) {
        Log.i( TAG, "first !isEnabled " );
        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        Log.i( TAG, "second !isEnabled" );
    // Otherwise, setup the connection
    } else {
        if (mService == null) {
            Log.i( TAG, "setupConnection BEFORE" );
            setupConnection();
            Log.i( TAG, "setupConnection AFTER" );
        }
    }
}

onResume()

public synchronized void onResume() {
    Log.i( "RESUME", "HERE" );
    super.onResume();
    if(D) Log.e(TAG, "+ ON RESUME +");

    Log.i( "RESUME", "AFTER HERE" );


    // Performing this check in onResume() covers the case in which BT was
    // not enabled during onStart(), so we were paused to enable it...
    // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
    if (mService != null) {
        // Only if the state is STATE_NONE, do we know that we haven't started already
        if (mService.getState() == BluetoothService.STATE_NONE) {
          // Start the Bluetooth chat services
          mService.start();
        }
    }
}
4

2 回答 2

12

当你强行停止一个应用程序时,你会彻底杀死它,什么也没有。没有方法被调用,什么都没有。这与系统杀死应用程序以保留内存不同。强制关闭并不意味着甜蜜,它意味着杀死错误的应用程序,这样它就不会浪费了。

所以下次你打开你的应用程序时,它会从头开始 - MainActivity。这就是为什么强制停止“可能导致应用程序行为不端”的原因。你可能在做一些有用的事情的过程中停止了它——比如写入服务器/文件系统等。这就是为什么你应该让你的应用程序尽可能高效,或者以能够处理意外关闭的方式对其进行编码。这可能意味着远离冗长的任务并快速且经常地储蓄。

于 2012-12-18T20:48:25.070 回答
2

由于强制停止旨在在您的应用程序没有响应时使用,因此它不会生成任何回调,但会删除您的进程。因此,您应该会看到与从“ActivityStart”重新启动活动一样的日志消息,因此以onCreate(). 至于为什么您没有看到日志记录消息,我不确定。确保您没有按 PID 过滤 logcat,因为您的新实例具有不同的 PID。

于 2012-12-18T20:54:21.747 回答