如何每天在Android应用中重复操作?

时间:2019-03-28 11:10:16

标签: android kotlin alarmmanager android-alarms periodicity

我想每天重复一次动作;即使应用未运行或设备已重新启动(重新启动),它也必须继续工作。 在我的代码中,我试图每1分钟显示一条TOAST消息(作为测试);

在模拟器中可以正常工作,但是在真实设备上却无法工作(我尝试对某些问题进行修复,如我在一些答案中看到的,但仍然是同一件事)

我的接收器

class MyReceiver : BroadcastReceiver() {
    private val channelId = "com.medanis.hikamwahimam"

    override fun onReceive(context: Context, intent: Intent) {
        Log.i("TAG","/////////////////// SHOW NOTIFICATION NOW //////////////////////")
        val builder = NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_stat_name)
            .setLargeIcon(BitmapFactory.decodeResource(context.resources,R.mipmap.ic_launcher_round))
            .setContentTitle("My notification")
            .setContentText("Much longer text that cannot fit one line...")
            .setStyle(
                NotificationCompat.BigTextStyle()
                    .bigText("Much longer text that cannot fit one line...Much longer text that cannot fit one line..."))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        with(NotificationManagerCompat.from(context)) {
            notify(12345, builder.build()) }
        Toast.makeText(context,"This toast will be shown every X minutes", Toast.LENGTH_LONG).show()
    }
}

MainActivity

class MainActivity : AppCompatActivity() {
    private var mAlarmManager : AlarmManager? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
//        showNotification()

        val mIntent = Intent(this, MyReceiver::class.java)

        val mPendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT)
        mAlarmManager = this
            .getSystemService(Context.ALARM_SERVICE) as AlarmManager
        mAlarmManager!!.setRepeating(
            AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
            60000, mPendingIntent
        )
    }
}

AndroidManifest.xml

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

问题是:

     

1 /-此代码不适用于REAL DEVICE。

     

2 /-如果用户重新启动设备,此代码将无效。

GitHub 上的示例(我做了一些更改,如我的朋友所建议的,但仍然是相同的错误)

1 个答案:

答案 0 :(得分:0)

  

1 /-此代码不适用于REAL DEVICE。

我已经下载了您的项目,并在我的设备上运行,并且可以正常运行,当我单击开始时,它会显示Toast,并且每分钟都会显示出来。

我建议您看看这个question

  

2 /-如果用户重新启动设备,此代码将无效。

如果您要在重新启动或关闭设备后重新启动BroadcastReceiver,则可能需要添加以下代码:

将此添加到您的manifest.xml

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

receiver中创建另一个manifest.xml

<receiver android:name=".BootCompletedIntentReceiver">
   <intent-filter>
     <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>

然后像以前一样创建BroadcastReceiver来创建Toast

class BootCompletedIntentReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if ("android.intent.action.BOOT_COMPLETED" == intent.action) {
          //Start your old broadcastreceiver
        }
    }
}

有关更多信息,请查看此post

希望有帮助。