设备重启后重新启动计划的通知(需要Firebase数据)

时间:2018-10-05 10:14:29

标签: android firebase firebase-realtime-database android-notifications android-broadcastreceiver

我的应用当前正在安排在特定时间(由用户选择)的任务通知。任务的标题和提醒日期保存在Firebase Realtime数据库中。

问题是,当设备重新启动时,所有这些都将丢失。因此,需要重新启动过去计划的所有相关通知。

因此,我有一个可以接收BOOT_COMPLETED意图的BroadcastReceiver。 但是,我无法访问Firebase DB,因为当前没有用户登录-我也无法启动Firebase身份验证(无法识别startActivityForResult,并且导入它会导致更多错误)。我认为那是因为BroadcastReceiver不是活动。

我想知道是否有解决办法。 我目前尝试设置一个意图来启动MainActivity(在此位置对用户进行身份验证),然后执行我的相关任务,但是那没用。

我想知道是否有解决办法,以获取经过身份验证的用户(或在设备重新启动时对其进行身份验证),然后从Firebase获取数据。

AlarmReceiver代码(扩展了BroadcastReceiver)-有点混乱,但有助于获取上下文。

public class AlarmReceiver extends BroadcastReceiver  {

private ChildEventListener mChildEventListener;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mTaskDatabaseReference;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
private int i;

@Override
public void onReceive(final Context context, Intent intent) {
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mFirebaseAuth = FirebaseAuth.getInstance();

    if (intent.getAction() != null && context != null) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            TaskInfoFragment.showReminderNotification(context, MainActivity.class, "hoooo",1000);
            onSignedOutCleanup(context);
            mTaskDatabaseReference=mFirebaseDatabase.getReference().child("users").child(MainActivity.getCurrentUserId());
            attachDatabaseReadListener(context);
            //TODO - HANDLE DEVICE REBOOT

        }
    }


    //Trigger the notification
    Bundle extras = intent.getExtras();
    String taskTitle = "Error, no task title!";
    int taskIntId=-1;
    if (extras != null) {
        taskTitle = extras.getString("taskTitle");
        taskIntId=extras.getInt("taskIntId");
    }

    TaskInfoFragment.showReminderNotification(context, MainActivity.class, taskTitle,taskIntId);

}

private void attachDatabaseReadListener(final Context context) {
      i=0;

        mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                i++;
                TaskList task = dataSnapshot.getValue(TaskList.class);
                TaskInfoFragment.showReminderNotification(context, MainActivity.class, task.getTitle(),i);
                Log.d("here is another task","title: "+task.getTitle());
            }
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
            public void onCancelled(DatabaseError databaseError) {}
        };

        mTaskDatabaseReference.addChildEventListener(mChildEventListener);

}

private void onSignedInInitialize(final String userId,Context context) {

    //Get reference for the task list for the logged in user and attach the database listener
    mTaskDatabaseReference=mFirebaseDatabase.getReference().child("users").child(userId);
    attachDatabaseReadListener(context);

}

private void onSignedOutCleanup(Context context) {
    Intent taskIntent = new Intent(context,MainActivity.class);

    // Send the intent to launch a new activity
    context.startActivity(taskIntent);
}

private void detachDatabaseReadListener() {
    if (mChildEventListener != null) {
        mTaskDatabaseReference.removeEventListener(mChildEventListener);
        mChildEventListener = null;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您甚至要在用户登录之前显示这些通知,那么显然它们并不意味着要与用户相关联。我将它们与另一个值关联,可能是一个标识设备的值。 James评论的InstanceIdToken可能是一个很好的解决方案,因为它标识了特定设备上的特定应用。

但绝对也可以查看Firebase Cloud Messaging,它使您可以在设备启动后立即将通知发送到设备。由于FCM消息是由Google Play服务中的接收者处理的,因此,与尝试从自己的接收者中的远程数据库中加载消息相比,这通常是一种更可靠的传递此类消息的方法。

并非偶然:FCM依靠实例ID令牌来标识向其传递消息的设备/应用。

答案 1 :(得分:0)

因此,总而言之,我使用SharedPreferences保存了当前登录的用户。 (之所以有效,是因为通知与用户相关,因此我们可以安全地假设最后一个登录的用户是相关的用户。)

然后,我更改了Firebase数据库树,以允许我使用当前登录的用户ID访问“任务”。再进行一些编码和错误修复,就可以了。

感谢所有帮助!