【问题标题】:Alarm Manager doesn't work in application with BroadcastReceiver警报管理器在具有 BroadcastReceiver 的应用程序中不起作用
【发布时间】:2017-05-22 23:08:24
【问题描述】:

我正在做一个应用程序,它使用geofences 来跟踪我们的事件,我想创建一个警报管理器,它每天激活并为当天的事件添加地理围栏(取自数据库)。

我需要创建一个活动来使用地理围栏,在这个活动中,我输入了BroadcastReceiver。似乎它根本不起作用。我什至没有从这些活动中得到任何日志。我不知道为什么,但我想 Manifest 中可能有问题。如果有人能看到这个,我将不胜感激。

类 MyScheduler:

public class MyScheduler extends Activity {


protected static final String TAG = "MyScheduler";

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setRecurringAlarm(this);
}

private void setRecurringAlarm(Context context) {

    Log.i(TAG, "setReccuringAlarm");
    Calendar updateTime = Calendar.getInstance();
    updateTime.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
    updateTime.set(Calendar.HOUR_OF_DAY, 15);
    updateTime.set(Calendar.MINUTE, 10);

    Intent intent = new Intent(context, Tasks.class);
    PendingIntent recurringDownload = PendingIntent.getBroadcast(context,
            0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) this.getSystemService(
            Context.ALARM_SERVICE);
    alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            updateTime.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, recurringDownload);
    }
}

使用 BroadcastReceiver 的任务:

public class Tasks  extends Activity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status> {
Context context;
final public static String ONE_TIME = "onetime";

EventDAO eventDAO;

protected static final String TAG = "MyGeofence";

Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String today = dateFormat.format(calendar.getTime());
List<Event> eventsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    context = getApplicationContext();

    mGeofenceList = new ArrayList<Geofence>();
    mGeofencePendingIntent = null;
    mSharedPreferences = getSharedPreferences(Constants.SHARED_PREFERENCES_NAME,
            MODE_PRIVATE);
    mGeofencesAdded = mSharedPreferences.getBoolean(Constants.GEOFENCES_ADDED_KEY, false);

    buildGoogleApiClient();
}

/// geofences mathods, not needed

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override

    public void onReceive(Context context, Intent intent) {
        Log.i(ONE_TIME, "Executed Tasks.Java File");
        //Some task here for every morning
        eventDAO = new EventDAO(context);
        eventsList = eventDAO.getComingEvents(today, today);

        for( Event event : eventsList){
            String place = event.getEndLocalisationX();
            Log.i(ONE_TIME, place);

            Double lat = Double.parseDouble(event.getEndLocalisationY());
            Double lng = Double.parseDouble(event.getEndLocalisationX());
            MY_PLACES.put(place, new LatLng(lat, lng));
        }

        populateGeofenceList();
        addGeofences();
    }
};

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(broadcastReceiver);
}

以及清单的一部分:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <activity android:name=".MyScheduler"/>
    <activity android:name=".Tasks"/>

    <receiver android:name=".Tasks" >
     </receiver>

我可以补充一点,所有带有地理围栏的东西都运行良好,所以我没有把地理围栏代码放在上面,因为它更容易阅读。希望有人能提供帮助! :)

【问题讨论】:

    标签: android broadcastreceiver scheduled-tasks alarmmanager geofencing


    【解决方案1】:

    您正在创建一个 PendingIntent 来发送广播,但您指定了一个 Activity 类(任务)。如果 Android 甚至允许这样做,您不应该设置警报来用 UI 来打断用户。您应该将广播接收器移到外部类中,例如 TasksReceiver:

    public class TasksReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
        Log.i(ONE_TIME, "Executed Tasks.Java File");
        //Some task here for every morning
        EventDAO eventDAO = new EventDAO(context);
        List<Event> eventsList = eventDAO.getComingEvents(today, today);
    
        for( Event event : eventsList){
            String place = event.getEndLocalisationX();
            Log.i(ONE_TIME, place);
    
            Double lat = Double.parseDouble(event.getEndLocalisationY());
            Double lng = Double.parseDouble(event.getEndLocalisationX());
            MY_PLACES.put(place, new LatLng(lat, lng));
        }
    
        populateGeofenceList();
        addGeofences();
       }
    }
    

    并为待处理的意图指定类名,清单中的接收者声明如下所示:

    <receiver android:name=".TasksReceiver" />
    

    【讨论】:

    • 感谢您的回答。这就是我一开始就尝试过的,但我不知道如何使用广播接收器中其他活动的地理围栏方法。我知道这可能是一个非常愚蠢的问题,但我对 java 没有任何经验。这就是为什么我发现如何在活动中进行广播。
    • 简单地说,这是行不通的。我不知道您所说的“使用来自其他活动的地理围栏方法”是什么意思,但任何功能包括“每天激活并为当前日期事件添加地理围栏(取自数据库)”都需要在独立的广播接收器中。
    • 是的,我很愚蠢,谢谢。我不知道为什么我有这个问题。非常感谢;)
    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多