Android Alarm Manager无法正常工作

时间:2011-08-17 15:47:31

标签: android manifest broadcast alarmmanager android-alarms

我的代码已实现了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();
    }
  }
}

的Manifest.xml

<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

2 个答案:

答案 0 :(得分:1)

  1. 广播待定没有定义任何动作的意图对我来说并不常见。

  2. 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                             
    }
}