Android 后台服务控制 UI 活动

3
我是android应用程序开发的新手,因此在成功运行应用程序方面遇到了一些严重问题。我想大多数问题都可以归因于缺乏Android平台概念并在Android上使用PC编程概念!
我的意图是开发基于UI的Android应用程序,但我有一个强烈的要求,即该应用程序应像守护程序一样运行!当我说守护进程时,当应用程序启动时,UI不应该可见!基于某些唤醒事件,应用程序应该被唤醒,以便用户可以看到UI。同样,基于某些睡眠事件,应用程序UI应该被隐藏。类似于Android上的闹钟应用程序。
UI部分对我来说非常容易,因为我使用了Qt端口进行Android开发,应用程序工作得很好。但是,这就像任何普通应用程序一样工作,并没有包括我上述要求。我尝试查看Qt文档,并没有提供实现此目标的方法,在某些论坛中,他们推荐使用Android SDK方法来实现此目标。
由于我不是Java专家,我阅读了很多关于Android开发的文章,并设法创建了一个“有点”满足上述要求的应用程序,但我遇到了一些问题,我想知道我是否遵循了正确的方法。因此,让我们总结以下我所做的事情。
1.我子类化android.app.Service,并在覆盖的onStartCommand中创建工作线程,以检查唤醒和睡眠事件。出于讨论的目的,让我们假设唤醒事件是每60分钟一次,而睡眠事件是在唤醒后5分钟左右。
2.在onStartCommand方法中,我正在广播一个Intent,期望创建我的服务的活动接收它(下面的步骤6解释了为什么我这样做)。
3.工作线程在满足唤醒条件时,按以下方式启动我的UI活动: Intent activityIntent = new Intent(getBaseContext(), MyUIActivity.class); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getApplication().startActivity(activityIntent);
4.当满足睡眠条件时,工作线程通过广播Intent请求我的UI活动完成,期望UI活动接收它。
5.最后,onStartCommand返回START_NOT_STICKY。
6.我有一个主要活动,该活动使用IntentFilter向BroadcastReceiver注册实例,以在从上述第2步启动服务之后接收Intent。在接收到Intent后,我调用finish()关闭UI,将我的服务设置为守护进程!
上述设置正常工作,我可以看到服务正常运行并显示适当的Toast消息,当满足唤醒条件时,UI也会显示出来,并且Qt小部件在屏幕上完美显示。
但是,我在以安全方式使此设置正常工作方面遇到了一些问题。以下是问题(不确定它们是否是真正的问题):有时候当我启动应用程序时,我看不到从onStartCommand方法开始服务的Toast消息,但logcat会显示以下消息:

W/ActivityManager( 628): 在1000ms内调度重新启动崩溃的服务org.example.myapp/.MyService I/ActivityManager( 628): 来自pid 21764的START u0 {flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity(具有额外信息)}启动了应用程序 W/ActivityManager( 628): 权限拒绝:来自null(pid = 21764,uid = 2000)的Intent{flg=0x10000000 cmp=org.example.myapp/.MyApplicationActivity(具有额外信息)}未从uid 10129导出

当我尝试手动启动应用程序时,它能正常运行!

其次,当我通过调用finish()来隐藏UI活动时,我认为我看到了以下消息:

I/WindowState( 628): WIN DEATH: Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity} W/ActivityManager( 628): 在1000ms内调度重新启动崩溃的服务org.example.myapp/.MyService W/WindowManager( 628): 强制从容器Window{428ef138 u0 org.example.myapp/org.example.myapp.MyApplicationActivity}中删除子窗口Window{41962f40 u0 SurfaceView}

在此之后,该服务将不再处于活动状态!

基本上,我的问题是:这是正确的操作方式吗?

1个回答

0

请确认当睡眠事件发生时,您的设备是否处于睡眠模式,即屏幕关闭或打开?

如果它已经处于睡眠状态,则您的接收器将不会接收到意图,因为它已经处于睡眠状态。您必须在活动中设置任何标志,以便在活动恢复时进行检查并相应地执行操作并完成活动实例。

您没有看到您的toast消息,因为服务的生命周期与Activity的生命周期无关。服务在后台持续运行,直到您明确停止它们或系统杀死它们。


我给出的睡眠事件只是一个例子。但我可以确认设备一直在运行,而且没有被锁定。我必须补充一点:我的UI应用程序还有一个要求,即每当UI正在运行时,屏幕应始终可见(不应自动变暗或锁定)。因此,在我的主UI活动的onResume重写方法中,我调用getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON),在onPause方法中,我调用getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON),以便设备不会休眠。 - asumang

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