创建自动启动和停止的Android服务

时间:2014-12-18 15:35:06

标签: android android-service

我对这整个Android服务感到很困惑。从我的理解,服务是一个应用程序'它在后台运行,可以自动启动和停止,并可以与其父母进行通信。应用程序。或者是吗?

以下是我实际尝试做的事情:

  1. 我有一个应用程序,用户可以输入他需要做某事的日期
  2. 应用程序在sqlite数据库中保存数据(用户需要做什么和日期)
  3. 我需要有一个在后台运行的服务,每天两次检查sqlite数据库是否存在用户当天需要做的事情。所以服务每天只运行两次。例如,在早上6点,服务将自动启动并检查数据库。然后它会自行关闭。晚上6点,服务将再次启动并检查数据库,并自行关闭。
  4. 当服务检测到用户需要在特定日期做某事时,它会向用户发送通知(如我们从whatsapp或电子邮件中获得的通知),提醒他需要做某事 5)当用户点击通知时,它将打开用户在
  5. 之前设置通知的应用程序

    这可以在Android上完成吗?如果没有,最接近的方法是什么?请指导我阅读正确的教程/文章,或者让我开始。目前我甚至不知道该怎么去谷歌。

2 个答案:

答案 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