我正在尝试实现一个易于使用的系统来处理 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
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 的完整源代码及其用法:链接