安卓系统中是否有“安装事件”?

51

在安装后第一次执行或直接执行之后,是否有处理的事件/接收器或其他内容?或者我需要使用首选项进行模拟吗?


我正在编写一个服务。它没有GUI界面。我该如何安排服务每天运行?(似乎我不能,因为似乎我不能在执行后直接执行代码。)它只能手动安装,所以可以使用adb,但这似乎是不必要的。 - user2768
4个回答

53

有一个ACTION_PACKAGE_ADDED广播意图,但被安装的应用程序不会接收到此广播。

因此,检查偏好设置是否已设置可能是最简单的解决方案。

SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this);
boolean firstRun = p.getBoolean(PREFERENCE_FIRST_RUN, true);
p.edit().putBoolean(PREFERENCE_FIRST_RUN, false).commit();

非常感谢!我一直在寻找这个意图,我有一个服务,必须每秒更新已安装的数据包的知识,有了这个意图,我可以将其缓存直到发生更改。 - Andras Balázs Lajtha
4
这实际上并没有回答这个问题。答案只展示了如何有条件地执行代码的部分。然而,这仍然需要先执行代码(即if条件)。上述方法对于应用程序的主活动很好,并且可以放置在其onCreate回调中。但是,这仍然要求用户至少启动一次应用程序。如果你没有活动或者不能依赖用户启动活动,那么你该把这段代码放在哪里? - user2690527

4

1

我认为这样的东西不存在,而且我认为这不是一个好主意:通常你不仅要处理安装,还要处理一些更新(比如:带有新功能的新版本)或某些资源的适当初始化。

对于资源,最好的方法是直接检查它们。

对于版本,我使用数据库,非常容易。


我已经在上面提供了动机(即为什么这是一个好主意):https://dev59.com/73E95IYBdhLWcg3wn_Vr#L68UoYgBc1ULPQZF47sQ - user2768

1

当数据库版本更改时,将调用SQLiteOpenHelper的OnUpgrade方法。我认为这可以用于处理新模式以外的其他事情。


6
抱歉打扰,但我认为在这种情况下只有一个正确的做法——处理新模式。参考SOLID的单一职责原则和常识。以防有人看到它。 - ryabenko-pro
每次数据库版本更改时都会调用此函数,因此不是执行此操作的好地方。 - dramzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接