安卓开发进程、广播、Application须注意的细节

进程(process)

进程是安卓运行的基本单位,程序都是在相同或不同进程中运行的,不同程序可以在相同进程执行,同一程序也可以在不同进程上运行

可以在清单文件中指定组件的进程

<service android:name="***"
            android:process="system">

        </service>

前方没有冒号的表示全局进程(可共享),有冒号表示私有进程(不可共享)

广播

广播分为动态广播和静态广播

静态广播在清单文件中注册,动态广播在代码中注册

<receiver
            android:name="***"
            android:process="system">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
broadcast=new Receiver();
IntentFilter filter=new IntentFilter();
filter.addAction("com.example.swustu.brodcast");
registerReceiver(broadcast,filter);

值得注意的是,它们虽然都是接收广播并消息的;但他们的生命周期并不相同。

静态广播的生命周期只有其onReceive方法的执行,当onreceive方法结束,其生命周期也就结束,就会被销毁,下一次接收将会重新创建广播实例。当然其方法中创建的线程等都将一并终止。

除非使用goAsync()方法表示这个广播要执行很长时间。

在这里插入图片描述

根据官方描述,广播处理在一定时间内没有返回将会导致ANR(应用程序无响应),goAsync()可以解决这个问题,但是使用之后得手动中止,且在执行过程中无法响应新的广播,长时间下来也会导致ANR

在这里插入图片描述

所以goAsync慎用

对于动态广播,它们的生命周期就与注册的组件生命周期一致了(从注册到结束与注册组件一致,注册之前不一致)即它的生命周期在注册组件结束时结束,记得在销毁时取消注册即可

Application

Application是应用程序基本类,它的生命周期是整个程序的生命周期(启动到结束)

onCreate方法是在程序启动时执行

一般来说Application用于存储程序运行时的全局变量。但本文要讲的是特殊情况

一般来说onCreate方法只执行一次,但对于指定了多进程的应用程序,它们的全局变量是非进程共享的,将会在多进程内多次创建同的Application,这时就不能再共享全局变量了
在这里插入图片描述

启动一个多线程的组件,就会先在那个进程创建一个Application对象(如果没有创建),然后再启动相应组件

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐