获得isFinishing在服务中工作

时间:2015-08-29 19:59:37

标签: android

我正在尝试从我的MainActivityTrackingService类传递上下文,以检查TrackingService中isFinishing()内的方法onDestroy(),但我得到{{ 1}}

如何让The method isFinishing() is undefined for the type Context在服务中工作?

MainActivity

isFinishing()

TrackingService:

public class MainActivity extends ActionBarActivity implements
        AsyncTaskCallback {
    private static Context mContext;

     public static Context getContext() {
            return mContext;
        }

}

修改

我正在尝试在关闭应用时删除TrackingService类的locationManger,而不是在用户切换活动时删除

在调用public class TrackingService extends Service implements AsyncTaskCallback, LocationListener { @Override public void onDestroy() { super.onDestroy(); if(lm != null && MainActivity.getContext().){ lm.removeUpdates(this); System.out.println("ABC TrackingService lm was removed."); }else{ System.out.println("ABC TrackingService lm locationManager is null."); } } } 时,是否有区分这两种情况?

我有一个trackingService onDestroy()组件,该组件在后台处理,并从locationManager活动启动。与此同时,我有另一个组件从服务器检索此数据并将其显示在MainActivity活动中。用户可以从MainActivity访问服务器中的此数据,当他单击MainActivity中的按钮时,带有InsentService类的alarmManager开始从服务器检索数据以在Map活动中显示它。

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

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

如何判断是否正在调用onDestroy导致用户欺骗应用程序,或者当用户在活动之间切换时是否调用onDestroy?

我感谢任何帮助。

MainActivity:

locationManager

TrackingService类:

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);

    }

}

地图活动:

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);

    }
    @Override
@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(wifi_receiver);
    System.out.println("ABC TrackingService onDestroy() was invoked.");

    if(lm != null){
        lm.removeUpdates(this);
        System.out.println("ABC TrackingService lm was removed.");
    }else{
        System.out.println("ABC TrackingService lm locationManager is null.");

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

1 个答案:

答案 0 :(得分:0)

isFinishing()只会告诉您是否已完成活动而非暂停。如果您的服务在活动isFinishing()可能仍会返回false之前被销毁,尽管应用程序已结束。

您的Service不会因为您切换到其他活动而被销毁。它应该独立于您的活动运行,直到您停止它或它被系统转储为免费资源。如果您想阻止系统转储您的服务,您可以在其START_STICKY中返回onCreate

如果您想在用户结束应用程序时终止服务,可以在主要活动的onDestroy方法中停止该服务,并检查活动是否正在完成:

public class MainActivity extends ActionBarActivity implements
    AsyncTaskCallback {

    ...

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (isFinishing()) {
            Intent i = new Intent(this, TrackingService.class);
            stopService(i);
        }
    }

修改

在澄清了您想要拥有的内容之后,这里有另一个可能对您有用的选项:

您只能在主要活动中启动该服务。您永远不会在代码中的任何位置调用stopService。但是,您bind为每项活动提供服务,并undbind在每项活动的onDestroy方法中{{1}}。见android documentation。所有绑定都已释放后,应停止该服务。