android怎么知道方法在哪里调用的,关于android:如何知道在Activity启动之前是否调用了Application类?...

我们有Splash extends Activity,这是我们应用程序的开始活动。 我们还具有CustomApplication extends Application类,该类在调用应用程序进程时被调用。

现在我们有以下要求。 每当启动应用程序/进程时,请调用Utils.doSomeDBWork()函数。

为此,我们已将此函数调用放在Splash和CustomApplication类的onCreate()中。 之所以将这个调用放在CustomApplication内,是因为可以通过deeplinks/notifications启动我们的应用程序,而不会调用Splash。 但是问题在于,如果该应用程序是通过Splash杀死并启动的,则同一功能将被调用两次。 一个来自CustomApplication,另一个来自Splash。

所以基本上我的问题是,如果已经从CustomApplication调用了该函数,则不要从Splash调用此函数。 我可以考虑通过使用一些静态变量或"共享首选项"来做到这一点。 但是不要以为这是一种干净的方法。 还有其他方法可以实现此目标,例如通过Intents传递一些信息等吗?

您可以为此使用事件总线。

为什么从活动中调用函数? 仅从您的Application类调用它是否足够?

How to know that Application class was called before Activity launch?

简而言之,每当Android"收到请求"以启动您的任何应用程序组件(活动,服务,BroadcastReceiver)并且您的应用程序尚未运行时,它都会分叉app_process(又名zygote),更改其在AndroidManifest.xml中定义为your.package.name的名称,初始化Application实例,调用其onCreate()方法,然后实例化所请求的组件并调用其生命周期方法(Activity的onCreate(),Service的onCreate()或BroadcastReceiver的onReceive())。

For this purpose we have put this function call in onCreate() of splash and CustomApplication classes.

这是多余的。仅从Application的onCreate()(它是最早的"入口点")到保证在任何其他组件的生命周期方法之前被调用的应用程序调用它就足够了。 Application类的唯一实例将一直存在,直到应用程序进程终止。

您可以通过记录每个生命周期方法轻松地对其进行测试。之后,您将没有任何疑问。

编辑OP的评论:

If the app process was running and the user back presses and exits, and then launches the app again, then CustomApplication class won't be called.

这只是部分正确。除非系统在后台杀死应用程序进程,否则不会调用CustomApplication的onCreate()(例如,通过从"最近的应用程序"中滑动您的应用程序来模拟这种情况)。

But our requirement is that CustomApplication class should be invoked in this case.

这超出了开发人员的范围。只有系统控制。

话虽如此,如果Android在后台杀死该应用程序,则将调用CustomApplication的onCreate()。如果没有,实现要求的一种简单方法是在CustomApplication中具有boolean标志,该标志将指示是否调用了Utils.doSomeDBWork()。

如果应用程序进程正在运行,并且用户后按并退出,然后再次启动应用程序,则不会调用CustomApplication类。 但是我们的要求是在这种情况下应调用CustomApplication类。 这就是为什么我们将那个放在Splash类的onCreate()方法中。

您可以在应用程序层上使用ActivityLifeCycleCallbacks进行一些控制。如果在splashActivity中使用它是您的解决方案,请跟踪您的活动并在回调中进行调用。我希望它能提供一个想法。

为什么不只从应用程序的类onCreate调用?

从深层链接/通知或启动启动应用程序时,始终会首先创建应用程序。

您也可以从静态变量中检查。

像下面

class Utils{

public static boolean doneWork = false; // this static variable will be false when app process is killed.

public doSomeDBWork(){

if(!doneWork){

//alreay done..

return;

}

:

:

doneWork = true;

}

}

我认为共享首选项对于这种情况是不好的方法,但是您可以使用静态变量或通过使用单例设计模式来实现此目的。

事件总线也是一个不错的选择...您可以查看事件总线的文档。

https://github.com/greenrobot/EventBus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值