我正在尝试从我的MainActivity
向TrackingService
类传递上下文,以检查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
:
如何判断是否正在调用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);
}
}
答案 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。所有绑定都已释放后,应停止该服务。