android - Android中的广播接收器不起作用
问题描述
我有一个运行包安装程序会话的简单服务,我想从中获取状态。包管理器有不同的状态,根据我收到的状态,我希望我的活动创建一个对话框,但我遇到了问题。
InstallerService.kt
:
class InstallerService: Service() {
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -999)) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> {
Toast.makeText(this, "Installing...", Toast.LENGTH_SHORT).show()
Log.d(TAG, "Requesting user confirmation for installation")
val confirmationIntent =
intent.getParcelableExtra<Intent>(Intent.EXTRA_INTENT)
confirmationIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
try {
startActivity(confirmationIntent)
} catch (e: Exception) {
}
}
PackageInstaller.STATUS_SUCCESS -> {
Log.d(TAG, "Installation succeed")
getSharedPreferences("installPrefs", Context.MODE_PRIVATE).edit().putBoolean("isInstalling", false).apply()
val mIntent = Intent(MainActivity.INSTALL_COMPLETED)
mIntent.action = MainActivity.INSTALL_COMPLETED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_ABORTED -> {
val mIntent = Intent(MainActivity.INSTALL_ABORTED)
mIntent.action = MainActivity.INSTALL_ABORTED
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_INVALID -> {
val mIntent = Intent(MainActivity.INSTALL_INVALID)
mIntent.action = MainActivity.INSTALL_INVALID
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_CONFLICT -> {
val mIntent = Intent(MainActivity.INSTALL_CONFLICT)
mIntent.action = MainActivity.INSTALL_CONFLICT
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_STORAGE -> {
val mIntent = Intent(MainActivity.INSTALL_STORAGE)
mIntent.action = MainActivity.INSTALL_STORAGE
LocalBroadcastManager.getInstance(this).sendBroadcast(mIntent)
}
PackageInstaller.STATUS_FAILURE_BLOCKED -> {
val mIntent = Intent(MainActivity.INSTALL_BLOCKED)
mIntent.action = MainActivity.INSTALL_BLOCKED
sendBroadcast(mIntent)
}
else -> {
Log.d(TAG, "Installation failed")
val mIntent = Intent(MainActivity.INSTALL_FAILED)
mIntent.action = MainActivity.INSTALL_ABORTED
sendBroadcast(mIntent)
}
}
stopSelf()
return START_NOT_STICKY
}
@Nullable
override fun onBind(intent: Intent?): IBinder? {
return null
}
companion object{
const val TAG = "VMInstall"
}
}
现在,当 k 尝试接收意图操作时,它根本不做任何事情
MainActivity.kt
:
class MainActivity : Main() {
private var isParent = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar: Toolbar = findViewById(R.id.home_toolbar)
setSupportActionBar(toolbar)
val navHost = findNavController(R.id.bottom_nav_host)
val appBarConfiguration = AppBarConfiguration(navHost.graph)
toolbar.setupWithNavController(navHost, appBarConfiguration)
navHost.addOnDestinationChangedListener{_, currFrag: NavDestination, _ ->
isParent = when (currFrag.id) {
R.id.home_fragment -> true
else -> false
}
setDisplayHomeAsUpEnabled(!isParent)
}
registerReceivers()
}
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
INSTALL_COMPLETED -> launchVanced()
}
}
}
override fun onDestroy() {
super.onDestroy()
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
}
override fun onPause() {
super.onPause()
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
}
override fun onResume() {
super.onResume()
registerReceivers()
}
private fun registerReceivers() {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_COMPLETED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_ABORTED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_BLOCKED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_STORAGE
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_CONFLICT
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_FAILED
))
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(
INSTALL_INVALID
))
}
companion object {
const val INSTALL_COMPLETED = "Installation completed"
const val INSTALL_ABORTED = "user aborted installation"
const val INSTALL_BLOCKED = "user blocked installation"
const val INSTALL_STORAGE = "there was an error with storage.\n Hold up how is that even possible?"
const val INSTALL_CONFLICT = "app conflicts with already installed app"
const val INSTALL_FAILED = "it just failed idk"
const val INSTALL_INVALID = "apk files are invalid"
}
}
有什么建议吗?提前致谢
解决方案
通过使用修复
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when {
inten.action.equals(INSTALL_COMPLETED) -> launchVanced()
}
}
}
代替
private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
INSTALL_COMPLETED -> launchVanced()
}
}
}
推荐阅读
- javascript - 需要检查以下字符串格式是否正确或未使用正则表达式
- python - 根据文件夹中的文件名重命名多个数据框
- spring-boot - 在 Spring Boot 生产代码中使用 AssertJ
- python - 如何使用 Visual Studio Code 为 cmake 添加预构建步骤?
- python-3.x - 错误:将组名“pk”重新定义为组 2;是第 1 组的第 38 位
- android - 如何在显示对话框时正确模糊背景
- bash - 用于每周清理一次詹金斯代理工作区的 bash 脚本
- javascript - ProbeError:无法识别的文件格式。节点 js 在 (.svg .gif) 文件上出现错误
- python - OpenStack,如何创建新星过滤调度程序?
- javascript - 如何在内容有限的情况下进行懒惰下载