2015-06-30 2 views
1

Я новичок в android, и я создаю приложение подмены MAC. Я создал IntentService для подмены MAC-адреса в приложении каждые 5 секунд, и он работает нормально. Затем я создал BaseActivity, из которого все мои действия расширяются, поэтому я могу обнаружить, когда приложение идет в фоновом режиме или нет, это также отлично работает. У меня уже есть это, когда приложение находится в фоновом режиме, MAC-адрес больше не изменяется и возвращается к исходному, но вместо этого я хочу просто остановить службу, когда приложение находится в фоновом режиме и перезапустить службу, когда приложение снова открывается. Вот мой код до сих пор:Остановить службу, когда приложение находится в фоновом режиме

BaseActivity

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.WifiManager; 
import android.util.Log; 
import android.widget.Toast; 

public class BaseActivity extends Activity { 
    private static int sessionDepth = 0; 
    public static boolean isInBackground = false; 
    WifiManager wifiManager; 
    private Intent myIntent; 



    // app in foreground 
    @Override 
    protected void onStart() { 
     super.onStart(); 
     sessionDepth++; 
     isInBackground = false; 

     // for MAC spoofing 
     myIntent = new Intent(this, IntentService.class); 
     startService(myIntent); 

    } 

    // app in background 
    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (sessionDepth > 0) 
      sessionDepth--; 
     if (sessionDepth == 0) { 
      Toast.makeText(getApplicationContext(), "App is in background", 
        Toast.LENGTH_SHORT).show(); 
      isInBackground = true; 
      Log.d("My log2", "background " + isInBackground); 
      wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
      wifiManager.setWifiEnabled(false); // restart wifi 
      wifiManager.setWifiEnabled(true); 
      stopService(myIntent); 
     } 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     stopService(myIntent); 
    } 

    public boolean getStatus(){ 
     return isInBackground; 
    } 

} 

IntentService

package edu.fiu.mpact.reuproject; 

import android.content.Intent; 
import android.net.wifi.WifiManager; 
import android.util.Log; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Random; 
import java.util.Timer; 
import java.util.TimerTask; 


    public class IntentService extends android.app.IntentService { 
     Process p = null; 
     String[] ouiList; 
     Random gen = new Random(); 
     char[] charList = {'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', 
       '8', '9'}; 


     public IntentService() { 
      super("MAC"); 
     } 

     @Override 
     protected void onHandleIntent(Intent intent) { 
      try { 
       ouiList = loadOUIs(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      try { 
       p = Runtime.getRuntime().exec("su"); // prompt for root access 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      new Timer().scheduleAtFixedRate(new TimerTask() { 
       BaseActivity b = new BaseActivity(); 

       @Override 
       public void run() { 
        Log.d("my log2", b.getStatus() + ""); 

        try { 
         if(!b.getStatus()) { 
          changeMac(); 
         } 

         Log.d("my log3", Utils2.getMACAddress("wlan0")); 
        } catch (IOException | InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, 0, 5000); // changes MAC every 3 seconds 



     } 
     private void changeMac() throws IOException, InterruptedException { 
      String mac = generateMac(); 

      //commands to execute 
      String[] cmds = {"ip link set wlan0 address " + mac}; 

      // execute the commands 
      DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
      for (String tmpCmd : cmds) { 
       os.writeBytes(tmpCmd + "\n"); 
      } 

     } 
     private String generateMac(){ 
      String s = ouiList[gen.nextInt(20847)] + ":"; 

      for(int i = 0; i < 6; i++){ 
       s = s + charList[gen.nextInt(16)]; 

       //add colon 
       if(((i + 1) % 2 == 0) && i != 5){ 
        s = s + ":"; 
       } 
      } 

      return s; 
     } 

     private String[] loadOUIs() throws IOException { 
      String[] ouiList = new String[20847]; 

      int i = 0; 
      InputStream inStream = getApplicationContext().getResources().openRawResource(R.raw.oui2); 
      InputStreamReader is = new InputStreamReader(inStream); 
      BufferedReader reader = new BufferedReader(is); 

      String word = reader.readLine(); //read first OUI 
      while(word != null){    //continue until no more OUI's 
       ouiList[i] = word; 
       word = reader.readLine(); 
       i++; 
      } 

      return ouiList; 

     } 


    } 

По какой-то причине служба не останавливается, когда приложение переходит в фоновый режим, несмотря на мой StopService() вызывает.

+0

Кроме того, это не имеет никакого смысла в android 'BaseActivity b = new BaseActivity();' вы не можете создать новое действие и ожидать, что он будет работать или быть активностью, которую вы выполняете где-то еще. – Budius

ответ

4

По какой-то причине служба не останавливается, когда приложение переходит в фоновый

Он долго остановился перед вашим stopService() вызов, так как он остановился, как только onHandleIntent() вернулся, миллисекунды после того, как он был создан.

Что не является остановкой, является ваш Timer, который работает на фоновом потоке и будет продолжаться до тех пор, пока вы не отмените его или ваш процесс не завершится.

ИМХО, это неуместное использование IntentService. Если вы хотите контролировать продолжительность жизни, используйте Service и прекратите работу фона в onDestroy().