应用程序在后台时停止服务

时间:2015-06-30 15:37:27

标签: java android macos intentservice

我是Android的新手,我正在创建一个MAC欺骗应用。我创建了一个IntentService,每隔5秒就在应用程序中欺骗MAC地址,并且工作正常。然后我创建了一个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()调用了,但当应用程序转到后台时,服务并没有停止。

1 个答案:

答案 0 :(得分:4)

  

由于某种原因,当应用程序转到后台时服务没有停止

它在stopService()调用之前很久就停止了,因为它在onHandleIntent()返回后停止,在创建后的几毫秒内停止。

什么不停止的是你的Timer,它在后台线程上运行并将继续运行,直到你取消它或你的进程终止。

恕我直言,这是对IntentService的不当使用。如果您想控制生命周期,请使用Service,并停止onDestroy()中的后台工作。