을 호출 할 때 Android 서비스가 중지되지 않으므로 애플리케이션 락커 용 서비스를 개발하고 있습니다. 주 활동에는 startService()
과 stopService()
을 각각 사용하여 서비스 시작과 중지 사이를 전환하는 스위치가 있습니다. 문제는 서비스를 중단하려고 시도 할 때 즉시 멈추지 않는 것입니다. 나는 그것을 어떻게 멈출 지 전혀 모른다. 난 내 서비스의 onDestroy()
에 stopself()
를 추가 해봤지만stopService()
public class LockerService extends Service {
String LockedApps[];
String allowedapp = null;
DataBaseHandler handler;
private ExecutorService executorService;
private ActivityManager activityManager = null;
String[] AppActivities = { .... };
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (executorService != null) {
executorService.shutdown();
}
stopSelf();
executorService.shutdown();
Toast.makeText(getApplicationContext(), "service stopped",
Toast.LENGTH_LONG).show();
}
@Override
public void onCreate() {
super.onCreate();
executorService = Executors.newSingleThreadExecutor();
activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
LockerThread thread = new LockerThread();
executorService.submit(thread);
handler = new DataBaseHandler(this);
}
class LockerThread implements Runnable {
Intent pwdIntent = null;
public LockerThread() {
pwdIntent = new Intent(LockerService.this, Locker.class);
pwdIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
@Override
public void run() {
while (true) {
handler.open();
LockedApps = handler.getPackages();
boolean status = handler.checkdata("PACKAGE");
handler.close();
while (status) {
String packname = activityManager.getRunningTasks(1).get(0).topActivity
.getPackageName();
String activityname = activityManager.getRunningTasks(1)
.get(0).topActivity.getClassName();
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(LockerService.this);
allowedapp = sp.getString("allowedapp", "anon");
// Log.i("activity name", activityname);
if ((packname.equals("com.packagename"))
&& (allowedapp.equals("com.packagename"))) {
// do nothing
} else if ((packname.equals("com.packagename"))
&& !(Arrays.asList(AppActivities)
.contains(activityname))) {
try {
Editor edit = sp.edit();
edit.putString("current_app", packname);
edit.commit();
startActivity(pwdIntent);
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if ((Arrays.asList(LockedApps).contains(packname))
&& (allowedapp.equals(packname))) {
// do nothing
} else if ((Arrays.asList(LockedApps).contains(packname))) {
Editor edit = sp.edit();
edit.putString("current_app", packname);
edit.commit();
startActivity(pwdIntent);
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
이 스레드에서보세요 (boolean_variable) 파괴하면서하는 동안 chenge에 false로 설정됩니다 부울 변수 지정 제안 : 를 http://stackoverflow.com/questions/2176375/service-wont- stop-stop-stop-service-method-called- – Willis
그리고 이것 : http://stackoverflow.com/questions/27459885/stop-service-in-anactivity –
참고로, 당신이하려는 것은 쓸모 없습니다. 안드로이드 4에서 이것을 포 그라운드 서비스로 실행하면 사용자는 상태 표시 줄에 액세스 할 수 있고 (전체 화면 활동에서도) 쉽게 서비스를 종료 할 수 있습니다. 포 그라운드 서비스로 실행하지 않으면, 시작된 앱이 즉각 포 그라운드를 벗어나 목적을 완전히 무효로 만들면 경고없이 살해 될 수 있습니다. 그리고 전경 활동 ('ActivityManager.getRunningTasks (1)')을 결정하기 위해 사용하는 해킹은 안드로이드 5에서 의도적으로 깨졌습니다. –