Android 什么';我的通知和服务有什么问题吗

Android 什么';我的通知和服务有什么问题吗,android,firebase-realtime-database,android-service,alarmmanager,android-workmanager,Android,Firebase Realtime Database,Android Service,Alarmmanager,Android Workmanager,我正在开发一个应用程序,它可以创建一个服务,当人们有生日(凌晨12点)时触发警报。该应用程序基于firebase实时数据库。我现在面临的问题是: 该服务在首次启动应用程序时不起作用,即:我收到toast“service Started”,但在清除应用程序后,该服务将不在运行的服务中 2.当应用程序第二次打开时,服务工作正常(同时发出警报) 3.我曾尝试实施Work manager,但在Android Nougat及以上版本中似乎不起作用。(它应该在哪里起作用!) 4.当应用程序打开时会触发通知,

我正在开发一个应用程序,它可以创建一个服务,当人们有生日(凌晨12点)时触发警报。该应用程序基于firebase实时数据库。我现在面临的问题是:

  • 该服务在首次启动应用程序时不起作用,即:我收到toast“service Started”,但在清除应用程序后,该服务将不在运行的服务中

    2.当应用程序第二次打开时,服务工作正常(同时发出警报)

    3.我曾尝试实施Work manager,但在Android Nougat及以上版本中似乎不起作用。(它应该在哪里起作用!)

    4.当应用程序打开时会触发通知,并且当应用程序处于后台时会有2个或更多通知

  • 那么,这里怎么了

    以下是我的课程:

    NotificationHelper.java

      public class NotificationHelper extends ContextWrapper {
    
        public NotificationHelper(Context base, int peopleCount) {
            super(base);
    
            this.peopleCount = peopleCount;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
                getManager().createNotificationChannel(channel);
            }
        }
    
    
    
        private int peopleCount;
        public static final String channelID = "channel_145";
        public static final String channelName = "Birthday Notification";
        private NotificationManager mManager;
    
    
    
    
        public NotificationManager getManager() {
            if (mManager == null) {
                mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            }
            return mManager;
        }
        public NotificationCompat.Builder getChannelNotification() {
            return new NotificationCompat.Builder(getApplicationContext(), channelID)
                    .setContentTitle("Birthday Reminder!")
                    .setContentText( peopleCount + " people have birthday today!")
                    .setSmallIcon(R.drawable.ic_stat_notify)
                    .setColor(Color.GREEN)
                    .setAutoCancel(true)
                    .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, Birthday.class), PendingIntent.FLAG_UPDATE_CURRENT));
    
        }
    }
    
      public class MyService extends Service {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
    
            Toast.makeText(getApplicationContext(),"Service Started",Toast.LENGTH_LONG).show();
    
            //StartWorker();
    
            StartAlarm();
    
            return Service.START_REDELIVER_INTENT;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void StartWorker()
        {
    
            Calendar currentDate = Calendar.getInstance();
            Calendar dueDate = Calendar.getInstance();
    
            dueDate.set(Calendar.HOUR_OF_DAY, 0);
            dueDate.set(Calendar.MINUTE, 0);
            dueDate.set(Calendar.SECOND, 0);
    
            if (dueDate.before(currentDate)) {
                dueDate.add(Calendar.HOUR_OF_DAY, 24);
            }
    
            long timeDiff = ((dueDate.getTimeInMillis())-(currentDate.getTimeInMillis()));
    
            final OneTimeWorkRequest oneTimeWorkRequest = new
                    OneTimeWorkRequest.Builder(Myworker.class)
                    .setInitialDelay(timeDiff, TimeUnit.MILLISECONDS)
                    .build();
    
            WorkManager.getInstance(getApplicationContext()).enqueue(oneTimeWorkRequest);
    
    
    
        }
    
        public void StartAlarm()
        {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,1);
    
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    
            Intent alarmIntent = new Intent(this, AlarmReceiver.class);
            alarmIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
    
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1456, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            Toast.makeText(getApplicationContext(),"Service Destroyed",Toast.LENGTH_LONG).show();
    
            Intent intent = new Intent(this, MyService.class);
            startService(intent);
    
        }
    }
    
      public class AlarmReceiver extends BroadcastReceiver {
    
        private DatabaseReference myRef;
        private ArrayList<String> allPeoples;
    
        private int numberOfPeoples;
    
        private Context ctx;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            ctx = context;
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            initPeoples();
    
        }
    
        public String getCurrentDate() {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat mdformat = new SimpleDateFormat("d MMMM");
            String strDate = mdformat.format(calendar.getTime());
            return strDate;
        }
    
    
        private  void initPeoples() {
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                    allPeoples =  new ArrayList<>();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        if(snapshot.getKey().equals("Teacher") || snapshot.getKey().equals("Staff")){
                            for(DataSnapshot faculty : snapshot.child("peoples").getChildren()){
                                String birthday = (String) faculty.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }else{
                            for(DataSnapshot student : snapshot.child("peoples").getChildren()){
    
    
                                String birthday = (String) student.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }
                    }
    
                    numberOfPeoples = allPeoples.size();
    
                    NotificationHelper notificationHelper = new NotificationHelper(ctx, numberOfPeoples);
                    NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
                    notificationHelper.getManager().notify(1, nb.build());
    
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
            });
    
        }
    
    
    
    }
    
        public class AutoStart extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent arg1)
        {
            Intent intent = new Intent(context, MyService.class);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(intent);
            } else {
                context.startService(intent);
            }
            Log.i("Autostart", "started");
        }
    }
    
    Myservice.java

      public class NotificationHelper extends ContextWrapper {
    
        public NotificationHelper(Context base, int peopleCount) {
            super(base);
    
            this.peopleCount = peopleCount;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
                getManager().createNotificationChannel(channel);
            }
        }
    
    
    
        private int peopleCount;
        public static final String channelID = "channel_145";
        public static final String channelName = "Birthday Notification";
        private NotificationManager mManager;
    
    
    
    
        public NotificationManager getManager() {
            if (mManager == null) {
                mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            }
            return mManager;
        }
        public NotificationCompat.Builder getChannelNotification() {
            return new NotificationCompat.Builder(getApplicationContext(), channelID)
                    .setContentTitle("Birthday Reminder!")
                    .setContentText( peopleCount + " people have birthday today!")
                    .setSmallIcon(R.drawable.ic_stat_notify)
                    .setColor(Color.GREEN)
                    .setAutoCancel(true)
                    .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, Birthday.class), PendingIntent.FLAG_UPDATE_CURRENT));
    
        }
    }
    
      public class MyService extends Service {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
    
            Toast.makeText(getApplicationContext(),"Service Started",Toast.LENGTH_LONG).show();
    
            //StartWorker();
    
            StartAlarm();
    
            return Service.START_REDELIVER_INTENT;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void StartWorker()
        {
    
            Calendar currentDate = Calendar.getInstance();
            Calendar dueDate = Calendar.getInstance();
    
            dueDate.set(Calendar.HOUR_OF_DAY, 0);
            dueDate.set(Calendar.MINUTE, 0);
            dueDate.set(Calendar.SECOND, 0);
    
            if (dueDate.before(currentDate)) {
                dueDate.add(Calendar.HOUR_OF_DAY, 24);
            }
    
            long timeDiff = ((dueDate.getTimeInMillis())-(currentDate.getTimeInMillis()));
    
            final OneTimeWorkRequest oneTimeWorkRequest = new
                    OneTimeWorkRequest.Builder(Myworker.class)
                    .setInitialDelay(timeDiff, TimeUnit.MILLISECONDS)
                    .build();
    
            WorkManager.getInstance(getApplicationContext()).enqueue(oneTimeWorkRequest);
    
    
    
        }
    
        public void StartAlarm()
        {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,1);
    
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    
            Intent alarmIntent = new Intent(this, AlarmReceiver.class);
            alarmIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
    
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1456, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            Toast.makeText(getApplicationContext(),"Service Destroyed",Toast.LENGTH_LONG).show();
    
            Intent intent = new Intent(this, MyService.class);
            startService(intent);
    
        }
    }
    
      public class AlarmReceiver extends BroadcastReceiver {
    
        private DatabaseReference myRef;
        private ArrayList<String> allPeoples;
    
        private int numberOfPeoples;
    
        private Context ctx;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            ctx = context;
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            initPeoples();
    
        }
    
        public String getCurrentDate() {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat mdformat = new SimpleDateFormat("d MMMM");
            String strDate = mdformat.format(calendar.getTime());
            return strDate;
        }
    
    
        private  void initPeoples() {
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                    allPeoples =  new ArrayList<>();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        if(snapshot.getKey().equals("Teacher") || snapshot.getKey().equals("Staff")){
                            for(DataSnapshot faculty : snapshot.child("peoples").getChildren()){
                                String birthday = (String) faculty.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }else{
                            for(DataSnapshot student : snapshot.child("peoples").getChildren()){
    
    
                                String birthday = (String) student.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }
                    }
    
                    numberOfPeoples = allPeoples.size();
    
                    NotificationHelper notificationHelper = new NotificationHelper(ctx, numberOfPeoples);
                    NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
                    notificationHelper.getManager().notify(1, nb.build());
    
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
            });
    
        }
    
    
    
    }
    
        public class AutoStart extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent arg1)
        {
            Intent intent = new Intent(context, MyService.class);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(intent);
            } else {
                context.startService(intent);
            }
            Log.i("Autostart", "started");
        }
    }
    
    AlarmReceiver.java

      public class NotificationHelper extends ContextWrapper {
    
        public NotificationHelper(Context base, int peopleCount) {
            super(base);
    
            this.peopleCount = peopleCount;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
                getManager().createNotificationChannel(channel);
            }
        }
    
    
    
        private int peopleCount;
        public static final String channelID = "channel_145";
        public static final String channelName = "Birthday Notification";
        private NotificationManager mManager;
    
    
    
    
        public NotificationManager getManager() {
            if (mManager == null) {
                mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            }
            return mManager;
        }
        public NotificationCompat.Builder getChannelNotification() {
            return new NotificationCompat.Builder(getApplicationContext(), channelID)
                    .setContentTitle("Birthday Reminder!")
                    .setContentText( peopleCount + " people have birthday today!")
                    .setSmallIcon(R.drawable.ic_stat_notify)
                    .setColor(Color.GREEN)
                    .setAutoCancel(true)
                    .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, Birthday.class), PendingIntent.FLAG_UPDATE_CURRENT));
    
        }
    }
    
      public class MyService extends Service {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
    
            Toast.makeText(getApplicationContext(),"Service Started",Toast.LENGTH_LONG).show();
    
            //StartWorker();
    
            StartAlarm();
    
            return Service.START_REDELIVER_INTENT;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void StartWorker()
        {
    
            Calendar currentDate = Calendar.getInstance();
            Calendar dueDate = Calendar.getInstance();
    
            dueDate.set(Calendar.HOUR_OF_DAY, 0);
            dueDate.set(Calendar.MINUTE, 0);
            dueDate.set(Calendar.SECOND, 0);
    
            if (dueDate.before(currentDate)) {
                dueDate.add(Calendar.HOUR_OF_DAY, 24);
            }
    
            long timeDiff = ((dueDate.getTimeInMillis())-(currentDate.getTimeInMillis()));
    
            final OneTimeWorkRequest oneTimeWorkRequest = new
                    OneTimeWorkRequest.Builder(Myworker.class)
                    .setInitialDelay(timeDiff, TimeUnit.MILLISECONDS)
                    .build();
    
            WorkManager.getInstance(getApplicationContext()).enqueue(oneTimeWorkRequest);
    
    
    
        }
    
        public void StartAlarm()
        {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,1);
    
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    
            Intent alarmIntent = new Intent(this, AlarmReceiver.class);
            alarmIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
    
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1456, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    
    
        @Override
        public void onDestroy() {
            super.onDestroy();
    
            Toast.makeText(getApplicationContext(),"Service Destroyed",Toast.LENGTH_LONG).show();
    
            Intent intent = new Intent(this, MyService.class);
            startService(intent);
    
        }
    }
    
      public class AlarmReceiver extends BroadcastReceiver {
    
        private DatabaseReference myRef;
        private ArrayList<String> allPeoples;
    
        private int numberOfPeoples;
    
        private Context ctx;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            ctx = context;
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            initPeoples();
    
        }
    
        public String getCurrentDate() {
            Calendar calendar = Calendar.getInstance();
            SimpleDateFormat mdformat = new SimpleDateFormat("d MMMM");
            String strDate = mdformat.format(calendar.getTime());
            return strDate;
        }
    
    
        private  void initPeoples() {
    
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            myRef = database.getReference("Users");
            myRef.keepSynced(true);
    
            myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    
                    allPeoples =  new ArrayList<>();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        if(snapshot.getKey().equals("Teacher") || snapshot.getKey().equals("Staff")){
                            for(DataSnapshot faculty : snapshot.child("peoples").getChildren()){
                                String birthday = (String) faculty.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }else{
                            for(DataSnapshot student : snapshot.child("peoples").getChildren()){
    
    
                                String birthday = (String) student.child("DOB").getValue();
    
                                if(birthday.equals(getCurrentDate())) {
                                    String member = birthday;
                                    allPeoples.add(member);
                                }
                            }
                        }
                    }
    
                    numberOfPeoples = allPeoples.size();
    
                    NotificationHelper notificationHelper = new NotificationHelper(ctx, numberOfPeoples);
                    NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
                    notificationHelper.getManager().notify(1, nb.build());
    
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
            });
    
        }
    
    
    
    }
    
        public class AutoStart extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent arg1)
        {
            Intent intent = new Intent(context, MyService.class);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(intent);
            } else {
                context.startService(intent);
            }
            Log.i("Autostart", "started");
        }
    }
    
    清单

        <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="......">
    
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    
        <application
            android:name="......"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:ignore="GoogleAppIndexingWarning"
            android:usesCleartextTraffic="true"
            >
            <activity android:name=".Activities.Birthday"></activity>
            <activity android:name=".Activities.Contributors" />
            <activity
                android:name=".Activities.SearchDetails"
                android:theme="@style/AppTheme.Fullscreen" />
            <activity android:name=".Activities.Search" />
            <activity android:name=".Activities.Students" />
            <activity android:name=".Activities.Settings" />
            <activity
                android:name=".Activities.FacultySlider"
                android:theme="@style/AppTheme.Fullscreen" />
    
            <activity
                android:name=".Activities.StudentSlider"
                android:theme="@style/AppTheme.Fullscreen" />
            <activity android:name=".Activities.PeopleList" />
            <activity android:name=".Activities.MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    
            <receiver android:name=".AlarmReceiver"/>
            <service android:name=".MyService"
                android:label="Birthday Notification Service"
                android:enabled="true"/>
            <receiver android:name=".AutoStart"
                android:enabled="true">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
                </intent-filter>
            </receiver>
    
        </application>
        <uses-permission android:name="android.permission.INTERNET" />
    
        <uses-permission
            android:name="android.permission.CALL_PHONE"
            tools:ignore="ManifestOrder" />
    
    </manifest>
    
    编辑2:
    在Android Oreo上,当应用程序打开时会自动触发通知

    您在哪个设备上构建应用程序?Android 4.4或更高版本您是在小米还是华为设备上构建应用程序?我的模拟设备是google pixel和nexus。是的,我想在小米或华为设备上运行我的应用程序,也可以在哪个设备上运行你的应用程序?Android 4.4或更高版本你是在小米或华为设备上运行你的应用程序吗?我的模拟设备是google pixel和nexus。是的,我也想在小米或华为设备上运行我的应用程序