切换活动后未调用onDestroy

时间:2015-08-30 08:41:57

标签: android

我有一个trackingService locationManager组件,该组件在后台处理,并从MainActivity活动启动。同时,我在MainActivity中有另一个组件(访问组件)从服务器检索此数据并将其显示在Map活动中。用户可以从MainActivity访问服务器中的这些数据,当他点击其中的一个按钮时,然后带有InsentService类的alarmManager开始从服务器检索数据,每隔15秒在Map活动中显示它(警报管理器正在停止当我在后台打开地图活动杀死应用程序或离开地图活动时)

我试图在两种情况下删除locationManager

  • 当用户点击MainActivity菜单中的复选框时。
  • 或关闭应用程序时(不是用户更改活动时)。

我遇到onDestroy()调用的问题,因为当我在两次活动之间切换时,服务没有被停止(这是奇怪的行为。)

  • 在启动应用程序后直接使用MainActivity终止应用程序时停止运行(onDestroy() - 调用MainActivity)。
  • 当我启动应用程序并进入MainActivity-> Map活动时,它会停止运行,我会在后台使用打开的Map(onDestroy() - 调用Map)终止应用程序。

  • 当我去MainActivity->地图活动 - >时停止了MainActivity和我在后台使用打开的MainActivity杀死应用程序(但在这种情况下,不会调用MainActivity的onDestroy。)。

  • 当我进入Main-> Map-> Main-> Map并且我在后台使用打开的Map活动杀死应用程序时它没有停止,因为在这种情况下,地图活动的onDestroy()是被调用。

有人能解释一下onDestroy()的这种奇怪行为吗?

我感谢任何帮助。

MainActivity:

public class MainActivity extends ActionBarActivity implements
        AsyncTaskCallback {
    TrackingService mService;
    boolean mBound = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.route_available);
        // Start the TrackingService class.
        Intent i = new Intent(this, TrackingService.class);
        startService(i);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        System.out.println("test onCreateOptionsMenu was invoked.");

        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem checkable = menu.findItem(R.id.checkable_menu);
        checkable.setChecked(isChecked);
        return true;
    }

    // Start and stop the background service.
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.checkable_menu:
            if (isChecked = !item.isChecked()) {
                item.setChecked(isChecked);
                Intent i = new Intent(this, TrackingService.class);
                startService(i);
                System.out.println("test if onOptionsItemSelected");
            } else {
                mService.stopTrackingService();

            }
            return true;

        default:
            return false;
        }
    }
@Override
protected void onDestroy() {
    super.onDestroy();
    Intent i = new Intent(this, TrackingService.class);
    stopService(i);

    }

}

TrackingService类:

public class TrackingService extends Service implements AsyncTaskCallback,
        LocationListener {
    LocationManager lm;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        detectLocation();
        return START_STICKY;
    }
    private void detectLocation() {
        // TODO Auto-generated method stub
        Toast.makeText(this, "Inside detectlocation()", Toast.LENGTH_SHORT)
                .show();
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30 * 1000, 0,
                this);
        enableGPS(lm);

    }
public void stopTrackingService(){
    lm.removeUpdates(this);
  }
}

地图活动:

public class Map extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener{
    @Override
    protected void onDestroy() {
        super.onDestroy();
 // To stop the service when the user closed the app in the background and the map ativity was opened.      
        stopAlarm();
        Intent i = new Intent(this, TrackingService.class);
        stopService(i);
        System.out.println("ABC Map onDestroy() was invoked!");

    }

}

1 个答案:

答案 0 :(得分:2)

在活动之间切换时,例如,如果您从活动A开始活动B,或者用户按下主页按钮。可能不会调用onDestroy的行为。在这种情况下,只保证onPause