Android应用程序终止后,我的活动上下文是否仍然不为空?

时间:2017-01-11 23:22:01

标签: android thread-safety android-service android-context android-lifecycle

我有活动A,用作vpnService B和C类中的上下文。 vpnService B有一个在VPN启动时启动的线程。因此,在应用程序终止后,它会继续运行。我的问题是,当B和C想要访问时,A的上下文是否仍然可以被访问?我是否必须将上下文本身绑定到服务以保留值?我提供了一个代码格式的示例,以进一步解释我的问题。

另外,B扩展了vpnService。因此,当以编程方式禁用VPN或通过用户禁用VPN时,它仍会通过onDestroy()

public class A extend Activity(){
    private static aContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_A);

        aContext = A.this;

        //vpn service starts
        //assume that the user alerts to allow it have already been implemented
        Intent myIntent = new Intent(A.this, B.class);
        startService(myIntent);
    }

    static Context getContext() {
        return aContext;
    }
}

/**
* Would I still be able to access the context from A on B and C after the application ends?
* i.e. when the user dismisses it from the app drawer?
*/

public class B extends vpnService {
    private ScheduledExecutorService ex;
    private static C cRef;

    Runnable aThread = new Runnable() {
        @Override
        public void run() {
            C.doStuff();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {  
        ex = Executors.newSingleThreadScheduledExecutor();

        //new thread every second
        ex.scheduleAtFixedRate(aThread, 0, 1, TimeUnit.SECONDS);

        return START_NOT_STICKY;
    }

     @Override
    public void onDestroy() {
        super.onDestroy();

        //shutd down the executor
        ex.shutdownNow();
    }
}

public class C{
    public void doStuff(){
        A.getContext();
    }
}

1 个答案:

答案 0 :(得分:1)

我认为不是。这种架构似乎很奇怪。有很多地方可以面对内存泄漏。 将静态范围中的Context,Activity,Fragment等类型设置为错误是完全错误的。 你应该修改你的任务并改变架构。

顺便说一下,如果你需要C.class中的Context,你可以从你的服务nor-Activity获取getContext()。

希望这对你有所帮助。