片段创建的 Intent 不会触发 onNewIntent
Intent created by fragment does not trigger onNewIntent
我正在开发一个使用 sdk 的应用程序,它利用 intent 在 sdk 和我的代码之间进行通信。
在我的应用程序中,每当用户扫描条形码时,活动片段都会发送包含扫描意图的广播。 MainActivity class 解码此意图并通过共享视图模型将其发送回片段。
我目前面临的问题是我的 onNewIntent 从未被调用过。我尝试使用自定义函数手动处理它,但这似乎不是正确的方法(而且它似乎也不起作用)。
我想要么我的意图有问题,要么我的视图模型运行不正常,或者可能是两者的结合。
class LoginFragment : Fragment() {
private val intentViewModel by activityViewModels<IntentViewModel>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login, container, false)
val btnScanner = view.findViewById<Button>(R.id.btnScan)
//If usercredentials get a value, that means the user has succesfully authenticated
intentViewModel.userCredentials.observe(viewLifecycleOwner, Observer { credentials ->
if (credentials[0] != "" && credentials[1] != "") {
navigateToHome(intentViewModel.userCredentials.value!!)
}
})
//Intent set by activity
intentViewModel.intent.observe(viewLifecycleOwner, Observer { intent ->
Timber.plant(Timber.DebugTree())
val decodedData =
intent!!.getStringExtra(
resources.getString(R.string.datawedge_intent_key_data)
)
//Never gets called --> intent never gets registered by activity
Timber.d("Intent observer got called with value $decodedData")
getUserCredentials(decodedData!!)
})
//Creates an intent based on motionevent, which gets broadcasted
btnScanner.setOnTouchListener { v, motionEvent ->
decodeEvent(v, motionEvent)
}
return view
}
//Hardcoded authentication example
private fun getUserCredentials(badgeId: String) {
var creds = Array(2) { "" }
creds[0] = "12345678"
creds[1] = "Logistics"
intentViewModel.userCredentials.value = creds
}
private fun decodeEvent(v: View, motionEvent: MotionEvent): Boolean {
if (motionEvent.action == MotionEvent.ACTION_DOWN) {
// Button pressed, start scan
val dwIntent = Intent()
dwIntent.action = "com.symbol.datawedge.api.ACTION"
dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING")
dwIntent.putExtra("Type", "START")
activity?.sendBroadcast(dwIntent)
//(activity as MainActivity).handleIntent(dwIntent)
} else if (motionEvent.action == MotionEvent.ACTION_UP) {
// Button released, end scan
val dwIntent = Intent()
dwIntent.action = "com.symbol.datawedge.api.ACTION"
dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "STOP_SCANNING")
dwIntent.putExtra("Type", "END")
activity?.sendBroadcast(dwIntent)
// (activity as MainActivity).handleIntent(dwIntent)
}
return true
}
fun navigateToHome(userCredentials: Array<String>) {
Navigation.findNavController(requireView())
.navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragment(userCredentials))
}
}
class MainActivity : AppCompatActivity(){
private val intentViewModel by viewModels<IntentViewModel>()
override fun onCreate( savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
//User scanned a barcode, which created an intent in the fragment
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intentViewModel.intent.value = intent
}
}
class IntentViewModel: ViewModel() {
var intent = MutableLiveData<Intent?>()
var userCredentials = MutableLiveData<Array<String>>()
}
如果您在清单中将启动模式指定为“singleTop”activity,OnNewIntent
将会调用
我正在开发一个使用 sdk 的应用程序,它利用 intent 在 sdk 和我的代码之间进行通信。 在我的应用程序中,每当用户扫描条形码时,活动片段都会发送包含扫描意图的广播。 MainActivity class 解码此意图并通过共享视图模型将其发送回片段。
我目前面临的问题是我的 onNewIntent 从未被调用过。我尝试使用自定义函数手动处理它,但这似乎不是正确的方法(而且它似乎也不起作用)。 我想要么我的意图有问题,要么我的视图模型运行不正常,或者可能是两者的结合。
class LoginFragment : Fragment() {
private val intentViewModel by activityViewModels<IntentViewModel>()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login, container, false)
val btnScanner = view.findViewById<Button>(R.id.btnScan)
//If usercredentials get a value, that means the user has succesfully authenticated
intentViewModel.userCredentials.observe(viewLifecycleOwner, Observer { credentials ->
if (credentials[0] != "" && credentials[1] != "") {
navigateToHome(intentViewModel.userCredentials.value!!)
}
})
//Intent set by activity
intentViewModel.intent.observe(viewLifecycleOwner, Observer { intent ->
Timber.plant(Timber.DebugTree())
val decodedData =
intent!!.getStringExtra(
resources.getString(R.string.datawedge_intent_key_data)
)
//Never gets called --> intent never gets registered by activity
Timber.d("Intent observer got called with value $decodedData")
getUserCredentials(decodedData!!)
})
//Creates an intent based on motionevent, which gets broadcasted
btnScanner.setOnTouchListener { v, motionEvent ->
decodeEvent(v, motionEvent)
}
return view
}
//Hardcoded authentication example
private fun getUserCredentials(badgeId: String) {
var creds = Array(2) { "" }
creds[0] = "12345678"
creds[1] = "Logistics"
intentViewModel.userCredentials.value = creds
}
private fun decodeEvent(v: View, motionEvent: MotionEvent): Boolean {
if (motionEvent.action == MotionEvent.ACTION_DOWN) {
// Button pressed, start scan
val dwIntent = Intent()
dwIntent.action = "com.symbol.datawedge.api.ACTION"
dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING")
dwIntent.putExtra("Type", "START")
activity?.sendBroadcast(dwIntent)
//(activity as MainActivity).handleIntent(dwIntent)
} else if (motionEvent.action == MotionEvent.ACTION_UP) {
// Button released, end scan
val dwIntent = Intent()
dwIntent.action = "com.symbol.datawedge.api.ACTION"
dwIntent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "STOP_SCANNING")
dwIntent.putExtra("Type", "END")
activity?.sendBroadcast(dwIntent)
// (activity as MainActivity).handleIntent(dwIntent)
}
return true
}
fun navigateToHome(userCredentials: Array<String>) {
Navigation.findNavController(requireView())
.navigate(LoginFragmentDirections.actionLoginFragmentToHomeFragment(userCredentials))
}
}
class MainActivity : AppCompatActivity(){
private val intentViewModel by viewModels<IntentViewModel>()
override fun onCreate( savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
//User scanned a barcode, which created an intent in the fragment
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
intentViewModel.intent.value = intent
}
}
class IntentViewModel: ViewModel() {
var intent = MutableLiveData<Intent?>()
var userCredentials = MutableLiveData<Array<String>>()
}
如果您在清单中将启动模式指定为“singleTop”activity,OnNewIntent
将会调用