【发布时间】:2020-09-14 21:30:05
【问题描述】:
我有一个运行包安装程序会话的简单服务,我想从中获取状态。包管理器有不同的状态,根据我收到的状态,我希望我的活动创建一个对话框,但我遇到了问题。
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"
}
}
有什么建议吗?提前致谢
【问题讨论】:
-
您的
Service运行了吗?广播Intent发送成功了吗? logcat 中是否显示任何错误?你的BroadcastReceiver的onReceive()有被调用吗?请添加调试日志和/或设置断点以缩小问题范围。 -
对不起,忘记将问题标记为已解决。我实际上是通过使用 intent.action.equals(INSTALL_COMPLETED) 而不是当前实现来修复它
标签: android android-intent broadcastreceiver