在 Android 开始使用警报管理器服务?
Starting service with Alarm Manager on Android?
您好,阅读了与此相关的其他问题,但答复从未解决我的问题。
我想在特定时间后使用警报管理器启动服务
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 上添加了这个(服务 class 在子包 "services" 上):
<service
android:name=".services.AlarmLevelServiceImproved"
android:enabled="true" />
但是服务没有启动,也没有打印日志。
知道如何使用 AlarmManager 启动服务吗?
我也成功了 this tutorial 但我没有发现我的代码有任何不同
谢谢
要使用 PendingIntent 启动服务,您需要使用静态方法 PendingIntent.getService()
来检索适当的 PendingIntent。
您的代码似乎出于某种原因使用了 PendingIntet.getBroadcast()
。如果您打算让 AlarmManager 确实发送广播,您可以在 BroadcastReceiver 中启动您的服务,否则将该行更改为 getService():
来自
alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0);
到
alarmIntent = PendingIntent.getService(getApplicationContext(), 0, alarmServiceIntent, 0);
您正在使用 getBroadcast()
创建 PendingIntent
,但 Intent
指向服务。该组合将不起作用。
由于您使用的是 RTC_WAKEUP
,因此您需要使用 getBroadcast()
和 WakeLock
才能获得可靠的结果。一种方法是使用 WakefulBroadcastReceiver
作为接收器的基础 class,然后将工作转发到 IntentService
.
此外,请不要在 extras 中传递用户名和密码,因为这些用户名和密码对 Intent
或 PendingIntent
上的任何东西都是可见的。在这种情况下,应该 只是您的应用程序和核心 OS,但我仍然打算做一些更安全的事情。
您好,阅读了与此相关的其他问题,但答复从未解决我的问题。
我想在特定时间后使用警报管理器启动服务
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 上添加了这个(服务 class 在子包 "services" 上):
<service
android:name=".services.AlarmLevelServiceImproved"
android:enabled="true" />
但是服务没有启动,也没有打印日志。
知道如何使用 AlarmManager 启动服务吗?
我也成功了 this tutorial 但我没有发现我的代码有任何不同
谢谢
要使用 PendingIntent 启动服务,您需要使用静态方法 PendingIntent.getService()
来检索适当的 PendingIntent。
您的代码似乎出于某种原因使用了 PendingIntet.getBroadcast()
。如果您打算让 AlarmManager 确实发送广播,您可以在 BroadcastReceiver 中启动您的服务,否则将该行更改为 getService():
来自
alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmServiceIntent, 0);
到
alarmIntent = PendingIntent.getService(getApplicationContext(), 0, alarmServiceIntent, 0);
您正在使用 getBroadcast()
创建 PendingIntent
,但 Intent
指向服务。该组合将不起作用。
由于您使用的是 RTC_WAKEUP
,因此您需要使用 getBroadcast()
和 WakeLock
才能获得可靠的结果。一种方法是使用 WakefulBroadcastReceiver
作为接收器的基础 class,然后将工作转发到 IntentService
.
此外,请不要在 extras 中传递用户名和密码,因为这些用户名和密码对 Intent
或 PendingIntent
上的任何东西都是可见的。在这种情况下,应该 只是您的应用程序和核心 OS,但我仍然打算做一些更安全的事情。