当应用完全关闭时,如何在特定日期的8:00 AM通知用户?

时间:2019-04-27 03:29:55

标签: javascript java android

示例:用户关闭了该应用程序,并且该应用程序已经设置了向用户发送通知的日期(28/04/2019)和时间(8:00 AM)。

我尝试使用这些代码示例     Send a notification when the app is closed https://guides.codepath.com/android/Starting-Background-Services#using-with-alarmmanager-for-periodic-tasks

我已经实现的是在应用程序内部运行时的通知。

如果可以的话,尝试举例说明一下,因为初学者(像我一样)可以通过这种方式更轻松地学习它,或者可以指导我逐步实现我所需要的过程。

2 个答案:

答案 0 :(得分:0)

我为您编写了一个示例,并对其进行了测试,希望对您有所帮助。

我认为您必须在应用中将 AlarmManager.RTC 更改为 AlarmManager.RTC_WAKEUP 。 >

通知1 :如果手机关机或重新启动,则必须在手机启动时再次重置闹钟,因此必须保存闹钟)或共享首选项等,然后在手机启动时重置

通知2 :此外,您还需要广播接收器才能知道手机何时启动。

通知3 :AlarmManager在所有Android版本中均可正常运行。

MainActivity

public class MainActivity extends AppCompatActivity {

    AlarmManager alarmManager;

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

        alarmManager =(AlarmManager) getSystemService(ALARM_SERVICE);

        findViewById(R.id.btnSetAlarm).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, 4);
                calendar.set(Calendar.MINUTE, 33);
                calendar.set(Calendar.SECOND, 10);
                calendar.set(Calendar.AM_PM, Calendar.PM);

                Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 243619,intent,0 );
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);

                Toast.makeText(MainActivity.this, "Alarm set", Toast.LENGTH_LONG).show();
            }
        });
    }
}

AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            if (alarmUri==null)
                alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            RingtoneManager.getRingtone(context, alarmUri).play();
            Toast.makeText(context, "Wake up!!! Wake up!!!", Toast.LENGTH_LONG).show();
        }catch (Exception ex){
            Log.d("AlarmReceiver", ex.getMessage());
        }
    }
}

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.alarmmanager">

    <application
        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">
        <receiver
            android:name=".AlarmReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

随时问任何问题。

答案 1 :(得分:0)

在您的任务中,我们可以使用三种方法

  1. 警报管理器
  2. JobScheduler
  3. FireaseJobDispatcher

警报管理器-这是触发特定任务的一种古老而经典的方法。但是,由于它是在KitKat中创建和引入的,因此在android OREO和PIE(我已经尝试过)中并不可靠。

JobScheduler -这是一个API,用于根据将在应用程序自己的进程中执行的框架调度各种类型的作业。它在所有android版本中都能正常工作(在O和P中经过测试对我有效!)。

FireaseJobDispatcher -直到JobScheduler出现折旧,这是一笔交易。其他一些工具也可以使用,例如WorkManager,Evernote的AndroidJob以及全部(使用谷歌搜索)。但是,JobScheduler是一个交易突破者,我建议您使用JobScheduler。