【发布时间】:2013-03-08 17:46:51
【问题描述】:
我正在尝试实现一个易于使用的系统来处理 android 的状态栏通知,我正在考虑以下问题:
- 创建一个数据库,用于存储显示时间和内容
- 使用 API 提供的“间隔”服务创建在后台运行的服务
- 在该服务中检查是否需要根据数据库显示任何通知,然后显示它。
唯一的问题是,我无法检测到是否需要启动服务。我尝试了这些东西,但到目前为止它们都没有奏效:
1.)如果服务已在本地存储上启动,则保存:
// Do this on application startup
var isRunning = Ti.App.Properties.getBool("service_running", false);
if(!isRunning)
{
var service = Titanium.Android.createService(...);
service.addEventListener('start', function()
{
Ti.App.Properties.setBool("service_running", true);
});
service.addEventListener('stop', function()
{
Ti.App.Properties.setBool("service_running", false);
});
service.start();
}
这显然是行不通的,因为android系统原生的onStop和onDestroy事件不会被调度,如果Service没有异常终止(比如用户强制停止应用程序),所以停止事件也不会被解雇。
2.) 尝试通过Titanium.Android.getCurrentService() 访问任何活动服务,但我收到一条错误消息,提示 Titanium.Android 没有名为 getCurrentService() 的方法。这很奇怪,因为 IDE 代码完成为我提供了这种方法。
3.) 使用 Intent 清除之前运行的 Service
var intent = Titanium.Android.createServiceIntent
(
{
url : 'notification/NotificationService.js'
}
);
intent.putExtra('interval', 1000 * 60);
//Stop if needed
Titanium.Android.stopService(intent);
//Then start it
Titanium.Android.startService(intent);
但似乎我需要相同的 Intent 实例,启动服务以停止它,因为在应用程序启动时执行此操作,然后退出并重新启动它会导致多个服务运行。
此时我已经没有想法了,关于如何检查正在运行的服务。如果您知道任何方法可以做到这一点,请告诉我!感谢您的任何提示!
编辑
这里是给了我尝试上述方法的想法的源材料(也许只是我用错了):
- 本地存储:Titanium.App.Properties
- 访问运行服务的方法:Titanium.Android.getCurrentService
- 使用Intent停止服务的方法:Titanium.Android.stopService
以及我编写的 NotificationHandler“类”和 NotificationService.js 的完整源代码及其用法:link
【问题讨论】:
-
您能解决这个问题吗?我正在努力解决一个非常相似的问题,如果不是同一个的话。 getCurrentService 对我也没有任何作用,我无法将意图/服务保存到应用程序属性等......非常烦人且令人困惑。更糟糕的是,我发现该服务可以被操作系统杀死,这是一个巨大的痛苦(而且它永远不会重新启动它)。
-
我有关于这个问题的建议..我开始输入但它太长了所以我发布为答案..请检查
标签: android titanium titanium-mobile