Stop a service when application is in background

被刻印的时光 ゝ 提交于 2019-12-24 13:15:49

问题


I'm new to android and I am creating a MAC spoofing app. I have created an IntentService to spoof the MAC address in the app every 5 seconds and it is working fine. Then I created a BaseActivity which all of my activities extend from, this is so I can detect when the app goes in the background or not, this is also working fine. I already have it so when the app is in the background, the MAC address no longer changes and goes back to its original, but instead of this I want to just stop the service when the app is in background and restart the service when the app is opened again. Here is my code so far:

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;

        }


    }

For some reason the service is not stopping when the app goes to background, despite my stopService() calls.


回答1:


For some reason the service is not stopping when the app goes to background

It stopped long before your stopService() call, as it stopped once onHandleIntent() returned, milliseconds after it was created.

What is not stopping is your Timer, which runs on a background thread and will continue running until you cancel it or your process terminates.

IMHO, this is an inappropriate use of IntentService. If you want to control the lifespan, use a Service, and stop background work in onDestroy().



来源:https://stackoverflow.com/questions/31142644/stop-a-service-when-application-is-in-background

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!