使用Android上的Alarm Manager启动服务?

时间:2015-02-16 13:37:58

标签: android service alarmmanager

嗨,阅读其他问题仍未解决,但答案从未解决我的问题。

我希望在特定时间后使用警报管理器

启动服务
    alarmMgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);

    alarmServiceIntent=new Intent(ListActivity.this, AlarmLevelServiceImproved.class);
    alarmServiceIntent.putExtra("username",usernameID);
    alarmServiceIntent.putExtra("password",userPass);
    alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0);

    . . .

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND,10);
    //calendar.set(Calendar.HOUR_OF_DAY, 19);

    //alarmMgr.setInexactRepeating(AlarmManager.RTC,calendar.getTimeInMillis(),
    //        AlarmManager.INTERVAL_HALF_HOUR,alarmIntent);
    //alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
    //        1000 * 10, alarmIntent);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
    Log.d("MioLog", "Alarm setted");

我的服务是:

public class AlarmLevelServiceImproved extends Service {

@Override
public void onCreate() {
    Log.d("MioLog","MyAlarmService.onCreate()");
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent intent) {
    Log.d("MioLog","MyAlarmService.onBind()");
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
    return null;
}
@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("MioLog","MyAlarmService.onDestroy()");
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("MioLog","MyAlarmService.onStart()");
    Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show();
    return super.onStartCommand(intent, flags, startId);

}
}

我在AndroidManifest.xml上添加了这个(服务类在子包“services”上):

 <service
        android:name=".services.AlarmLevelServiceImproved"
        android:enabled="true" />

但是服务没有启动,也没有打印日志。

知道如何使用AlarmManager启动服务吗?

我也对this tutorial提起诉讼,但我发现我的代码没有任何区别

由于

2 个答案:

答案 0 :(得分:1)

要使用PendingIntent启动服务,您需要使用静态方法PendingIntent.getService()来检索适当的PendingIntent。

您的代码似乎因任何原因使用PendingIntet.getBroadcast()。如果您打算让AlarmManager确实发送广播,您可以在BroadcastReceiver中启动您的服务,否则将该行更改为getService():

alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0);

alarmIntent = PendingIntent.getService(getApplicationContext(), 0, alarmServiceIntent, 0);

答案 1 :(得分:1)

您正在使用getBroadcast()创建PendingIntent,但Intent指向服务。这种组合不起作用。

由于您使用的是RTC_WAKEUP,因此您需要使用getBroadcast()WakeLock来获得可靠的结果。一种方法是使用WakefulBroadcastReceiver作为接收者的基类,然后将工作转发到IntentService

此外,请不要在附加内容中传递用户名和密码,因为任何可以在IntentPendingIntent上获取的内容都可以看到这些内容。在这种情况下,应该只是你的应用程序和核心操作系统,但我仍然希望做一些更安全的事情。