Android Alarm Manager无法正常工作

问题描述 投票:0回答:2

我的代码实现了警报管理器示例(其他问题的代码),但是,我的alarmReceiver(扩展BroadcastReceiver)不起作用;我不知道我的MainActivity是否没有触发意图,或者我的alarmReceiver没有注册。

所以我的alarmService也没有工作(因为Receiver不工作)。

我在manifest.xml中写了这个权限。

这是相关的代码。希望有人可以帮我解决这个问题。非常感谢。


get box.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();

alarm receiver.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);
    }
}

alarm service.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);
    }
  }
}

on boot receiver.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);
  }
}

wakeful intent service.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
android manifest broadcast alarmmanager android-alarms
2个回答
1
投票
  1. 广播待定没有定义动作的意图对我来说并不常见。
  2. AlarmManager可以使用服务待定意图。 /* (...) */ Intent i = new Intent(context, AlarmService.class); PendingIntent pi = PendingIntent.getService(context, 0, i, 0); /* (...) */

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类

public class AlarmReciever extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        // TODO Auto-generated method stub                                  
        // Your Code     When Alarm willl trigger                             
    }
}   
© www.soinside.com 2019 - 2024. All rights reserved.