报警服务崩溃
Alarm service crashes
我正在尝试创建一个闹钟,其中包含我已经存储在 Parse 中的结束时间列表。
我有一个带有此代码的 AlarmService:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Toast.makeText(this,"onStartCommand()",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, AlarmScreenActivity.class);
startActivity(intent);
return flags;
}
按下添加警报 activity 中的保存按钮后服务关闭,如下所示:
//set time into calendar instance
Calendar calendar= Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,mAlarmDetails.timeHour);
calendar.set(Calendar.MINUTE,mAlarmDetails.timeMinute);
AlarmManager reminder = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.getService(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
reminder.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);
到达时间后,应用程序崩溃并且我的日志显示:
java.lang.RuntimeException: Unable to start service com.example......AlarmService@16859914 with Intent { flg=0x4 cmp=com.example.....AlarmService (has extras) }: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
我不太明白这个日志错误。有人可以解释并帮助我解决这个问题吗?
AlarmService 的 Toast 也从未出现。
另一个问题,我必须从按钮启动我的服务吗?有没有办法不使用按钮就可以做到这一点?我认为如果我可以在没有按钮的情况下执行此操作,我的应用程序会更好地运行,因为时间信息在解析中是在线的。
我也想让我的闹钟每天都响。我目前有小时和分钟的信息。我需要一些信息来告诉它每天关闭吗?
提前致谢
更新
我添加了一个唤醒锁,这样它将唤醒我的 phone 进入我的服务,如下所示:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Toast.makeText(this,"onStartCommand()",Toast.LENGTH_SHORT).show();
//wake lock
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, "My Wake Log");
mWakeLock.acquire();
//start reminder screen
Intent intent = new Intent(this, AlarmScreenActivity.class);
ReminderIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return flags;
}
现在我有另一个日志说:
java.lang.RuntimeException: Unable to start service com.example....AlarmService@129539b6 with Intent { flg=0x4 cmp=com.....AlarmService (has extras) }: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
这是什么意思?
您看到的问题是因为发送 Intent
以启动 Activity
是从 Service
发送的,所以它的 Context
没有 task/back堆叠。 logcat 显示您需要将标志 FLAG_ACTIVITY_NEW_TASK
添加到 Service
的 Intent
才能启动 Activity
。
综上所述,您可能仍会 运行 遇到问题,因为正在使用警报来启动 Service
。如果设备处于休眠状态并且警报已过期,系统将唤醒足够长的时间,以便 AlarmManager
能够在内部处理警报。如果闹钟的 PendingIntent
是针对 BroadcastReceiver
的,那么它还会使设备保持足够长的唤醒时间,以便调用已注册的接收器。如果 PendingIntent
用于 Service
或 Activity
,它不会做同样的事情。本文将帮助提供一些额外的细节(和示例代码):http://po.st/7UpipA
这是你的问题
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
当您想通过非 activity 上下文启动 activity 时,您必须将 FLAG_ACTIVITY_NEW_TASK
标志添加到起始意图,这样您的 onStartCommand
代码就像这 :
Intent intent = new Intent(this, AlarmScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
我正在尝试创建一个闹钟,其中包含我已经存储在 Parse 中的结束时间列表。
我有一个带有此代码的 AlarmService:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Toast.makeText(this,"onStartCommand()",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, AlarmScreenActivity.class);
startActivity(intent);
return flags;
}
按下添加警报 activity 中的保存按钮后服务关闭,如下所示:
//set time into calendar instance
Calendar calendar= Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,mAlarmDetails.timeHour);
calendar.set(Calendar.MINUTE,mAlarmDetails.timeMinute);
AlarmManager reminder = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.getService(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
reminder.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);
到达时间后,应用程序崩溃并且我的日志显示:
java.lang.RuntimeException: Unable to start service com.example......AlarmService@16859914 with Intent { flg=0x4 cmp=com.example.....AlarmService (has extras) }: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
我不太明白这个日志错误。有人可以解释并帮助我解决这个问题吗?
AlarmService 的 Toast 也从未出现。
另一个问题,我必须从按钮启动我的服务吗?有没有办法不使用按钮就可以做到这一点?我认为如果我可以在没有按钮的情况下执行此操作,我的应用程序会更好地运行,因为时间信息在解析中是在线的。
我也想让我的闹钟每天都响。我目前有小时和分钟的信息。我需要一些信息来告诉它每天关闭吗?
提前致谢
更新
我添加了一个唤醒锁,这样它将唤醒我的 phone 进入我的服务,如下所示:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Toast.makeText(this,"onStartCommand()",Toast.LENGTH_SHORT).show();
//wake lock
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, "My Wake Log");
mWakeLock.acquire();
//start reminder screen
Intent intent = new Intent(this, AlarmScreenActivity.class);
ReminderIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return flags;
}
现在我有另一个日志说:
java.lang.RuntimeException: Unable to start service com.example....AlarmService@129539b6 with Intent { flg=0x4 cmp=com.....AlarmService (has extras) }: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
这是什么意思?
您看到的问题是因为发送 Intent
以启动 Activity
是从 Service
发送的,所以它的 Context
没有 task/back堆叠。 logcat 显示您需要将标志 FLAG_ACTIVITY_NEW_TASK
添加到 Service
的 Intent
才能启动 Activity
。
综上所述,您可能仍会 运行 遇到问题,因为正在使用警报来启动 Service
。如果设备处于休眠状态并且警报已过期,系统将唤醒足够长的时间,以便 AlarmManager
能够在内部处理警报。如果闹钟的 PendingIntent
是针对 BroadcastReceiver
的,那么它还会使设备保持足够长的唤醒时间,以便调用已注册的接收器。如果 PendingIntent
用于 Service
或 Activity
,它不会做同样的事情。本文将帮助提供一些额外的细节(和示例代码):http://po.st/7UpipA
这是你的问题
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
当您想通过非 activity 上下文启动 activity 时,您必须将 FLAG_ACTIVITY_NEW_TASK
标志添加到起始意图,这样您的 onStartCommand
代码就像这 :
Intent intent = new Intent(this, AlarmScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);