我的代码已实现了Alarm Manager示例(其他问题的代码),但是,我的alarmReceiver(扩展BroadcastReceiver)无法正常工作;我不知道我的 MainActivity未触发意图或我的alarmReceiver未注册良好。
所以我的alarmService也没有工作(因为Receiver不工作)。
我在manifest.xml中写了这个权限。
这是相关的代码。希望有人可以帮我解决这个问题。非常感谢。
getBox.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.getbox);
///
Intent intent = new Intent(getBox.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBox.this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5 * 1000), pendingIntent);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("ALARM_RECEIVER", "WORKING!!!");
notificationStatus(context);
}
private void notificationStatus(Context context) {
final NotificationManager mNotificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
final int icon = R.drawable.icon;
final CharSequence tickerText = context.getString(R.string.app_name);
final long when = System.currentTimeMillis();
final Notification notification = new Notification(icon, "ALARM_TEXT_1", when);
final Intent notificationIntent = new Intent(context.getApplicationContext(), getBox.class);
final PendingIntent contentIntent = PendingIntent.getActivity(
context.getApplicationContext(), 0, notificationIntent, 0);
notification.setLatestEventInfo(context, tickerText, "ALARM_TEXT_2", contentIntent);
mNotificationManager.notify(1, notification);
}
}
AlarmService.java
public class AlarmService extends WakefulIntentService {
public AlarmService() {
super("AlarmService");
}
@Override
protected void doWakefulWork(Intent intent) {
File log=new File(Environment.getExternalStorageDirectory(),
"AlarmLog.txt");
Log.d("ALARM_SERVICE", "WORKING");
try {
BufferedWriter out=new BufferedWriter(
new FileWriter(log.getAbsolutePath(),
log.exists()));
out.write(new Date().toString());
out.write("\n");
out.close();
}
catch (IOException e) {
Log.e("AppService", "Exception appending to log file", e);
}
}
}
OnBootReceiver.java
public class OnBootReceiver extends BroadcastReceiver {
private static final int PERIOD=3000; // 3 sec
@Override
public void onReceive(Context context, Intent intent) {
AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, AlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0,
i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime()+60000,
PERIOD,
pi);
}
}
WakefulIntentService.java
abstract public class WakefulIntentService extends IntentService {
abstract void doWakefulWork(Intent intent);
public static final String LOCK_NAME_STATIC="com.commonsware.android.syssvc.AppService.Static";
private static PowerManager.WakeLock lockStatic=null;
public static void acquireStaticLock(Context context) {
getLock(context).acquire();
}
synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic==null) {
PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
lockStatic=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
LOCK_NAME_STATIC);
lockStatic.setReferenceCounted(true);
}
return(lockStatic);
}
public WakefulIntentService(String name) {
super(name);
}
@Override
final protected void onHandleIntent(Intent intent) {
try {
doWakefulWork(intent);
}
finally {
getLock(this).release();
}
}
}
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:screenOrientation="portrait" android:name=".Mail"></activity>
<activity android:screenOrientation="portrait" android:name=".getBox">
</activity>
<activity android:screenOrientation="portrait" android:name=".mainPage"></activity>
<activity android:screenOrientation="portrait" android:name=".sendBox"></activity>
<activity android:screenOrientation="portrait" android:name=".main" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name=".DataProvider" android:authorities="com.fleax.vocalclip.dataprovider" />
<receiver android:name=".OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name=".AlarmReceiver"></receiver>
<service android:name=".AlarmService"></service>
</application
答案 0 :(得分:1)
广播待定没有定义任何动作的意图对我来说并不常见。
AlarmManager可以使用Service Pending Intent。
/* (...) */
Intent i = new Intent(context, AlarmService.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
/* (...) */
答案 1 :(得分:0)
public void scheduleAlarm(View V)
{
// time at which alarm will be scheduled here alarm is scheduled at 1 day from current time,
// we fetch the current time in milliseconds and added 1 day time
// i.e. 24*60*60*1000= 86,400,000 milliseconds in a day
Long time = new GregorianCalendar().getTimeInMillis()+24*60*60*1000;
// create an Intent and set the class which will execute when Alarm triggers, here we have
// given AlarmReciever in the Intent, the onRecieve() method of this class will execute when
Intent intentAlarm = new Intent(this, AlarmReciever.class);
//Get the Alarm Service
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//set the alarm for particular time
alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
Toast.makeText(this, "Alarm Scheduled for Tommrrow", Toast.LENGTH_LONG).show();
}
AlarmReciever Class
public class AlarmReciever extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
// Your Code When Alarm willl trigger
}
}