我正在尝试创建一个可以打开和关闭移动数据的应用程序,当屏幕显示时,移动数据也应该打开。所以我试图在用户打开屏幕时停止服务。我有一个调用SwitchService类的主要活动,有没有办法从服务本身内部停止服务?我做了很多谷歌搜索,但没有任何工作,onDestroy(),stopSelf().....是什么问题?
public class SwitchService extends Service {
Handler mHandler;
@Override
public void onCreate() {
}
private void switchOff() {
scheduleNext(10*1000);
setMobileDataEnabled(this,false);
}
private void switchOn() {
scheduleNext2(10*1000);
setMobileDataEnabled(this,true);
System.out.println("still runnin");
}
private void scheduleNext(int time) {
mHandler.postDelayed(new Runnable() {
public void run() {
switchOn();
}
},time);
}
private void scheduleNext2(int time) {
mHandler.postDelayed(new Runnable() {
public void run() {
switchOff();
}
},time);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mHandler = new android.os.Handler();
switchOn();
new Thread(new Runnable(){
@Override
public void run() {
checkLock();
}
}).start();
return START_STICKY;
}
private void checkLock() {
scheduleNextLockCheck(1*1000);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn = powerManager.isScreenOn();
if (isScreenOn) {
System.out.println("Screen onnn");
setMobileDataEnabled(this,true);
SwitchService.this.onDestroy();
}
}
private void scheduleNextLockCheck(int time) {
mHandler.postDelayed(new Runnable() {
public void run() {
checkLock();
}
},time);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void setMobileDataEnabled(Context context, boolean enabled) {
final ConnectivityManager conman = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Class conmanClass;
try {
conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass
.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField
.get(conman);
final Class iConnectivityManagerClass = Class
.forName(iConnectivityManager.getClass().getName());
@SuppressWarnings("unchecked")
final Method setMobileDataEnabledMethod = iConnectivityManagerClass
.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
stopSelf将停止服务,但这并不会停止服务所拥有的处理程序,线程等。你必须在onDestroy方法中手动完成。