我想每天重复一次动作;即使应用未运行或设备已重新启动(重新启动),它也必须继续工作。 在我的代码中,我试图每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 上的示例(我做了一些更改,如我的朋友所建议的,但仍然是相同的错误)
答案 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
希望有帮助。