在 Android 应用冷启动时,阻止网络请求,直到 *** 启动

Posted

技术标签:

【中文标题】在 Android 应用冷启动时,阻止网络请求,直到 *** 启动【英文标题】:On Android app cold start, prevent network requests until *** started 【发布时间】:2020-05-22 02:44:12 【问题描述】:

在我们的应用中,我们有许多不同的模块可以自行发出网络请求。应用程序可以选择使用 *** 进行安全连接。 *** 服务仅为我们的应用程序处理网络。 我的问题是:在应用程序冷启动时,启用 *** 功能时,如何防止模块在 *** 服务启动之前发出网络请求。

【问题讨论】:

【参考方案1】:

我的项目中有类似的问题,但是我有一个模块需要等待建立 ***。无论如何,我有一个小代码来检测是否连接了 ***。

代码如下:

class ***Monitor 
    private final String ***_INTERFACE = "tun0";

    private On***StatusChange mCallback;
    private MonitorThread mThread = null;
    private Handler mHandler = new Handler(Looper.getMainLooper());

    public interface On***StatusChange 
        void on***Connect();

        void on***Disconnect();
    

    ***Monitor() 
        this(null);
    

    ***Monitor(@Nullable On***StatusChange callback) 
        mCallback = callback;
    

    void startMonitor() 
        if ((mThread == null) || !mThread.isAlive()) 
            mThread = new MonitorThread();
            mThread.start();
        
    

    void stopMonitor() 
        if (mThread != null) 
            mThread.terminate();
            try 
                mThread.join();
             catch (Exception e) 
            
            mThread = null;
        
    

    boolean is***ConnectionUp() 
        try 
            ArrayList<NetworkInterface> infs = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface inf : infs) 
                if (inf.getName().equals(***_INTERFACE) && inf.isUp() && inf.getInterfaceAddresses().size() > 0) 
                    return true;
                
            
         catch (SocketException e) 
            return false;
        

        return false;
    

    private class MonitorThread extends Thread 
        private volatile boolean mRunning = true;

        void terminate() 
            mRunning = false;
        

        @Override
        public void run() 
            mRunning = true;

            for (int i = 0; i < 5; i++) 
                try 
                    delay(100);

                    ArrayList<NetworkInterface> infs = Collections.list(NetworkInterface.getNetworkInterfaces());

                    for (NetworkInterface inf : infs) 
                        if (inf.getName().equals(***_INTERFACE)) 
                            for (int r = 0; r < 10; r++) 
                                if (!mRunning) 
                                    mHandler.post(new Runnable() 
                                        @Override
                                        public void run() 
                                            if (mCallback != null) 
                                                mCallback.on***Disconnect();
                                            
                                        
                                    );

                                    return;
                                

                                if (inf.isUp() && inf.getInterfaceAddresses().size() > 0) 
                                    delay(1000);

                                    mHandler.post(new Runnable() 
                                        @Override
                                        public void run() 
                                            if (mCallback != null) 
                                                mCallback.on***Connect();
                                            
                                        
                                    );

                                    return;
                                

                                delay(50);
                            
                        
                    
                 catch (SocketException e) 
                
            

            mHandler.post(new Runnable() 
                @Override
                public void run() 
                    if (mCallback != null) 
                        mCallback.on***Disconnect();
                    
                
            );

        

        private void delay(int time) 
            try 
                Thread.sleep(time);
             catch (InterruptedException e) 
                Thread.currentThread().interrupt();
            
        
    

也许它也可以帮助你。随意更改。

【讨论】:

以上是关于在 Android 应用冷启动时,阻止网络请求,直到 *** 启动的主要内容,如果未能解决你的问题,请参考以下文章

android 性能优化 -- 启动过程 冷启动 热启动

屏幕关闭时,Android 10 会阻止网络请求和 GPS 呼叫

Android 7.0应用冷启动流程分析

Android 7.0应用冷启动流程分析

android冷启动优化

android冷启动优化