2014-12-20 2 views
2

을 호출 할 때 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(); 
       } 
      } 
     } 

    } 
} 

} 
+0

이 스레드에서보세요 (boolean_variable) 파괴하면서하는 동안 chenge에 false로 설정됩니다 부울 변수 지정 제안 : 를 http://stackoverflow.com/questions/2176375/service-wont- stop-stop-stop-service-method-called- – Willis

+0

그리고 이것 : http://stackoverflow.com/questions/27459885/stop-service-in-anactivity –

+0

참고로, 당신이하려는 것은 쓸모 없습니다. 안드로이드 4에서 이것을 포 그라운드 서비스로 실행하면 사용자는 상태 표시 줄에 액세스 할 수 있고 (전체 화면 활동에서도) 쉽게 서비스를 종료 할 수 있습니다. 포 그라운드 서비스로 실행하지 않으면, 시작된 앱이 즉각 포 그라운드를 벗어나 목적을 완전히 무효로 만들면 경고없이 살해 될 수 있습니다. 그리고 전경 활동 ('ActivityManager.getRunningTasks (1)')을 결정하기 위해 사용하는 해킹은 안드로이드 5에서 의도적으로 깨졌습니다. –

답변

0

당신이 서비스를 중지하고

내 코드가 작동하지 않습니다하지만 스레드는 executing..you가 중지해야 여전히 스레드 ... 당신이 while(true) 루프가이 있기 때문에 당신이 처음에 진실하고

+0

부울은 '휘발성'이어야합니다. –

관련 문제