【问题标题】:Android: Alarms and IntentServicesAndroid:警报和 IntentServices
【发布时间】:2014-11-01 21:18:14
【问题描述】:

在对一起实现 IntentServices 和 Alarms 进行了大量研究之后,我想出了这个。我不确切知道这段代码会发生什么,所以我需要帮助才能确切知道发生了什么。

public class MainActivity{
  
  //....

    public void onNewItemAdded(String[] _entry){
            
            //...

  	        Intent intent = new Intent(MainActivity.this, UpdateService.class);
	        startService(intent);
    }

  //....
}

public class AlarmReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Intent startIntent = new Intent(context, UpdateService.class);
		context.startService(startIntent);
      }
    public static final String ACTION_REFRESH_ALARM = "com.a.b.ACTION_REFRESH_ALARM";
}

public class UpdateService extends IntentService{
  //...
  @Override
	public void onCreate() {
		super.onCreate();
		alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
		String ALARM_ACTION = AlarmReceiver.ACTION_REFRESH_ALARM;
		Intent intentToFire = new Intent(ALARM_ACTION);
		alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		Context context = getApplicationContext();
		SharedPreferences prefs = PreferenceManager
				.getDefaultSharedPreferences(context);
		int updateFreq = Integer.parseInt(prefs.getString(
				PreferencesActivity.PREF_UPDATE_FREQ, "60"));
		boolean autoUpdateChecked = prefs.getBoolean(
				PreferencesActivity.PREF_AUTO_UPDATE, false);
		if (autoUpdateChecked) {
			int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
			long timeToRefresh = SystemClock.elapsedRealtime() + updateFreq
					* 60 * 1000;
			alarmManager.setInexactRepeating(alarmType, timeToRefresh,
					updateFreq * 60 * 1000, alarmIntent);
		} 
		else {
			alarmManager.cancel(alarmIntent);
		}
		refreshKeywords();
	}
 }

我的目标是让 refreshKeywords() 方法每分钟被调用一次。另外,如果 onNewItemAdded() 方法被多次调用会怎样?

对不起,如果这个问题很愚蠢,我是初学者。

【问题讨论】:

    标签: alarmmanager alarm intentservice repeatingalarm


    【解决方案1】:

    如果您希望每分钟调用一次refreshKeywords()method,为什么要这样使用AlarmManager,

      private void ServiceRunningBackground() {
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            final int restartAlarmInterval = 6000;
            final int resetAlarmTimer = 2*1000;
            final Intent restartIntent = new Intent(this, MyService.class);
            restartIntent.putExtra("ALARM_RESTART_SERVICE_DIED", true);
            final AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            Handler restartServiceHandler = new Handler()
            {
                @Override
                public void handleMessage(Message msg) {
                    PendingIntent pintent = PendingIntent.getService(getApplicationContext(), 0, restartIntent, 0);
                    alarmMgr.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + restartAlarmInterval, pintent);
                    sendEmptyMessageDelayed(0, resetAlarmTimer);
                }
            };
            restartServiceHandler.sendEmptyMessageDelayed(0, 0);
        }
    }
    

    只要在你想要的地方调用这个方法并相应地设置时间

    【讨论】:

    • 我不明白。使用此实现时,refreshKeywords() 方法在哪里出现?这个函数是用来替代 AlarmReceiver 类的吗?
    • 是的,您可以将这个功能用于您的 AlarmReceiver
    • 好的,我应该如何修改 onHandleIntent() 方法?我希望仅当 SystemPreferences 活动表明它已由用户启用时才将警报设置为自动刷新。我已经在 onHandleIntent() 方法中做到了。还有,这个ServiceRunningBackground()方法应该放在哪里,应该在哪里调用呢?
    • 如果您希望在应用程序启动时启动警报通过调用此方法激活警报。
    • 哦,好吧,基本上 ServiceRunningBackground() 会为 UpdateService 类的 onHandleIntent() 启动警报。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多