【发布时间】:2018-12-20 22:30:20
【问题描述】:
我有这个代码:
public class MyWidgetProvider : AppWidgetProvider
{
public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
Log.Debug("WIDGET", "Updating the widget");
// Open app on click
RemoteViews views = new RemoteViews(context.PackageName, Resource.Layout.MyWidget);
Intent launchAppIntent = new Intent(context, typeof(MainActivity));
PendingIntent launchAppPendingIntent = PendingIntent.GetActivity(context, 0, launchAppIntent, PendingIntentFlags.UpdateCurrent);
views.SetOnClickPendingIntent(Resource.Id.main, launchAppPendingIntent);
appWidgetManager.UpdateAppWidget(appWidgetIds[0], views);
// Start timer
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 1000;
timer.Elapsed += OnTimedEvent;
timer.Enabled = true;
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
Log.Debug("WIDGET", "Updating status...");
new Handler(Looper.MainLooper).Post(() =>
{
//Run my code to periodically update the widget
});
}
}
我想知道为什么会发生以下情况:
- 当我将小部件放在手机屏幕上时,计时器开始运行,这没关系。
- 当我点击应用程序启动的小部件时,计时器继续运行,这没关系。
- 当我点击后退按钮时,应用程序进入后台,计时器继续运行,这没关系。
- 当我在任务管理器中终止应用程序时,计时器停止,这很糟糕。
- 当我再次单击小部件时,应用程序启动但计时器没有恢复运行,这很糟糕。
- 计时器仅在调用下一个 OnUpdate 时才恢复运行(我的最短时间间隔为 30 分钟),这很糟糕,因为我需要在屏幕打开时频繁更新(或者当小部件对用户可见时更好)。
我想了解这里的基础知识,因为我找不到任何相关信息。为什么计时器在我第一次将小部件放在屏幕上时运行(没有运行应用程序)并在应用程序被终止时停止?
是的,我已经阅读了几乎所有关于小部件基础知识的内容,然后是关于使用 AlarmManager、Service、JobService、JobIntentService、JobScheduler 等的内容。但是我对这个带有计时器的解决方案很感兴趣,因为它非常简单并且适用于所有当前的 Android 版本(甚至最新的奥利奥)。要解决的问题是在屏幕关闭时停止计时器,并在它继续时重新启动它。为了节省手机电池。
【问题讨论】:
-
那行不通。当您的应用程序的进程终止时,
Timer也会消失。像使用AlarmManager这样的解决方案之所以起作用,是因为时间是由系统处理的,并且您的应用可以在需要时从外部重新启动。 -
是的,看来我会使用 timer + AlarmManager 组合。 AlarmManager 应该在被杀死时再次唤醒应用程序。将在这里进行更多测试。
标签: android xamarin android-widget