在Android上,图书馆是否能够收到应用程序背景/前景的通知?

时间:2015-07-01 22:39:23

标签: android

我正在编写一个使用Timer执行预定后台处理的库。一个关键功能是延长电池寿命,所以我希望我的库暂停后台处理,而不是主动使用应用程序。

理想情况下,如果我的库可以接收到Activity.onPause()和Activity.onResume()的等价物,而不必为它创建API,那就太棒了。我不想依赖正在实现我的库的开发人员在他们的应用程序的各种活动中调用MyLibrary.onPause()和MyLibrary.onResume()。

除API之外还有其他解决方案吗?我想也许我的图书馆可以注册一个广播 - 但我目前还没有找到任何有用的东西......寻找建议......

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用registerActivityLifecycleCallbacks()为Activity生命周期事件设置侦听器。这是API 14+,但现在这应该不是什么大问题。

答案 1 :(得分:0)

你可以使用一些Hacks

在您的资源库中将一个活动作为上下文,并在其isShown()

上不断检查DecorView
MyLibrary(Context context){
 if(context instanceof Activity){
        boolean activityStatus =    ((Activity)c).getWindow().getDecorView().isShown();
//true means it is shown, and you start your loop and keep checking something like this
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                for(;;){
                    boolean tempStatus = ((Activity)c).getWindow().getDecorView().isShown() 
                    && activityStatus && /*((Activity)c).getWindow().
                    getDecorView().isLaidOut() if api 19+*/;

                    if(tempStatus){
                        //it is still showing or its previous value is being maintained
                    }else{
                        //it has been changed..
                    }}}});}//ending braces

一些限制将是,当显示DialogFragment时,它可能会检出true,可能或可能不是,但您可以通过执行{{1}检查当前对View的关注是否在该窗口上这将返回一个非null;你可以尝试一下,看看

getWindow().getCurrentFocus()始终返回falseonPause()开启时

答案 2 :(得分:0)

你的问题有很多误解,所以很难回答,但我可以给你一些建议。

首先,您不应该使用计时器来安排Android上的工作。您应该使用Handler来安排UI事件和使用服务(如IntentService)的AlarmManager进行独立于活动的后台工作。

如果工作与您的活动直接相关,则不应使用AlarmManager计划工作,而是使用绑定的服务。当没有活动连接时,这种服务会自动停止。

如果作品独立于您的活动,那么节省电池的最佳方法是在AlarmManager中选择合适的运行频率并使用不精确的重复。这样,系统可能会在一个批次中运行所有待处理任务以节省电量。

我邀请您阅读我提到的所有组件的文档。