我对这整个Android服务感到很困惑。从我的理解,服务是一个应用程序'它在后台运行,可以自动启动和停止,并可以与其父母进行通信。应用程序。或者是吗?
以下是我实际尝试做的事情:
这可以在Android上完成吗?如果没有,最接近的方法是什么?请指导我阅读正确的教程/文章,或者让我开始。目前我甚至不知道该怎么去谷歌。
答案 0 :(得分:1)
我建议在android中使用AlarmManager。它实际上是在特定时间(几秒,几天,几周......)运行任务的追踪者。
首先使用正确的函数编写服务。查看文档以了解适合您的服务类型。
http://developer.android.com/guide/components/services.html
[Service (Enabled = true)]
public class AndroidSyncService:Service
{
public override StartCommandResult OnStartCommand (global::Android.Content.Intent intent, StartCommandFlags flags, int startId)
{
var command = intent.GetStringExtra ("commandType");
switch (command) {
case "CheckSQL":
{
RunCheckSqlFunction();
}
break;
}
}
private void RunCheckSqlFunction()
{
//RUN TASK
//IF TASK IS FINISHED, STOP THE SERVICE (this.StopSelf ();)
}
}
这是用c#(xamarin)编写的,但它类似于android分配。该服务在意图中接收包含字符串“commandType”,该字符串指示必须在服务中执行哪种类型的off函数。
现在您已经有了服务,您可以使用alarmmanager注册在服务中启动“CheckSQL”功能的意图。
var intent = new Intent (this, typeof(AndroidSyncService)).PutExtra ("commandType", "CheckSQL");
var pendingIntent = PendingIntent.GetService (this, 0, intent, 0);
var alarm = (AlarmManager)GetSystemService (Context.AlarmService);
alarm.SetRepeating (AlarmType.Rtc, 0,TimeSpan.FromHours(6).Milliseconds, pendingIntent);
有了这个,我们告诉警报管理员每6小时启动一次服务来运行你的函数来检查sql是否有变化。通知代码可以放在您的服务中,但您的任务是选择将结果传达给用户的方式。希望这有帮助!
答案 1 :(得分:1)
AlarmManager用于在某些预定时间运行代码。您可以设置重复闹钟,从下午6点/下午6点开始每12小时运行一次。
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// Set the alarm to start at 6:00 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 6);
calendar.set(Calendar.MINUTE, 0);
// setRepeating() lets you specify a precise custom interval--in this case,
// 12 hours.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60 * 60 * 12, alarmIntent);
然后你需要指定一个BroadcastReceiver并在AndroidManifest.xml中声明它
<receiver android:name=".AlarmReceiver">
</receiver>
然后处理该消息
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startService(...your service intent ...);
}
}
您可能希望使用IntentService来运行数据库调用。有关如何创建Intent服务,请参阅http://responsiveandroid.com/2014/12/16/android-services-what-they-are-what-they-are-not.html。