Sous multi-module ou en composant, le saut de page est un endroit difficile à gérer. Voici un enregistrement de la méthode de saut. L'unification suivante avec le nom du package d'application auquel com.android.demo
faire référence.
BroadcastReceiver
L'utilisation de la diffusion est le moyen le plus simple de gérer les sauts de page en vous inscrivant à la diffusion. Il convient de noter que la diffusion est restreinte depuis la version 7.0. Pour la diffusion d'applications, les méthodes suivantes peuvent être utilisées, et 10.0 et les versions antérieures peuvent être utilisées sur plusieurs modèles. De même, vous pouvez également utiliser l'activité pour gérer. La logique de base est la même, donc je ne la répéterai pas ici.
Dans AndroidManifest.xml, permission
et uses-permission
sont obligatoires:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.demo"
tools:ignore="LockedOrientationActivity">
...
<permission android:name="com.android.demo.broadcast.PageReceiver.permission"
android:protectionLevel="signature" />
<uses-permission android:name="com.android.demo.broadcast.PageReceiver.permission" />
<application>
...
<receiver
android:name=".broadcast.PageReceiver"
android:enabled="true"
android:exported="false"
android:permission="com.android.demo.broadcast.PageReceiver.permission">
<intent-filter>
<action android:name="com.android.demo.broadcast.PageReceiver" />
</intent-filter>
</receiver>
</application>
</manifest>
Définissez des paramètres publics pour gérer les sauts
import android.content.ComponentName
import android.content.Context
import android.content.Intent
object PageConstants {
const val pageReceiver = "com.android.demo.broadcast.PageReceiver"
const val pagePackage = "com.android.demo"
const val pageReceiverPermission = "com.android.demo.broadcast.PageReceiver.permission"
//我这里需要跳转的页面不多,所以在采用特定值的方式
const val gotoVipPage = "gotoVipPage"
@JvmStatic
fun gotoVipPage(context: Context) {
val intent = Intent(pageReceiver)
//带上你要传递的参数,加上去就可以了
intent.putExtra(PageConstants.gotoVipPage, PageConstants.gotoVipPage)
//这个是必须添加的,为了在小米等手机上执行
intent.component = ComponentName(pagePackage, pageReceiver)
//pageReceiverPermission使用在AndroidManifest中注册的permission
context.sendBroadcast(intent, PageConstants.pageReceiverPermission)
}
}
PageReceiver
Implémentation en
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import cc.fotoplace.PageConstants
class PageReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when {
//在这里处理参数
intent.hasExtra(PageConstants.gotoVipPage) -> {
val intentActivity = Intent(context, VipInfoActivity::class.java)
intentActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intentActivity)
}
}
}
}
Sautez en reflétant le nom de la classe
Grâce à la réflexion, vous pouvez accéder directement à la page, ou traiter de la méthode que vous souhaitez traiter
import android.content.Context
import android.content.Intent
import android.util.Log
object PageConstants {
@JvmStatic
fun gotoVipPage(context: Context) {
try {
val intentActivity =
Intent(context, Class.forName("com.android.demo.VipInfoActivity"))
intentActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (intentActivity.resolveActivity(context.packageManager) != null) {
context.startActivity(intentActivity)
} else {
Log.i("xx", "无法处理该跳转")
}
} catch (e: ClassNotFoundException) {
e.printStackTrace()
Log.i("xx", "找不到该页面")
}
}
}
Pour la méthode ci-dessus, pour le rappel du résultat, vous devez gérer vous-même la méthode de onActivityResult.
Voici quelques points à prendre en compte: Pour les fichiers, les images, etc., vous pouvez utiliser ContentResolver
pour traiter le chemin de transmission, et vous n'avez pas besoin d'envoyer le fichier directement.
// Add the image to media store.
fun addImage(
resolver: ContentResolver, title: String,
date: Long, orientation: Int,
path: String?
): Uri? {
// Insert into MediaStore.
val values = ContentValues(6)
values.put(MediaStore.Images.ImageColumns.TITLE, title)
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, "$title.jpg")
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, date)
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/jpeg")
values.put(MediaStore.Images.ImageColumns.ORIENTATION, orientation)
values.put(MediaStore.Images.ImageColumns.DATA, path)
var uri: Uri? = null
try {
uri = resolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values
)
} catch (th: Throwable) {
}
return uri
}
Lien profond
Lors de l' AndroidManifest
enregistrement d'un DeepLinkActivity
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.demo"
tools:ignore="LockedOrientationActivity">
...
<application>
...
<activity
android:name=".DeepLinkActivity"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="route" android:host="open.my.app"/>
</intent-filter>
</activity>
</application>
</manifest>
Acceptez DeepLinkActivity, recevez les données souhaitées ici, puis traitez-les
class DeepLinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val action = intent?.action
val scheme = intent?.data
val value = intent?.getStringExtra(PageConstants.gotoVipPage)
}
}
Comment envoyer
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.Log
object PageConstants {
const val gotoVipPage = "gotoVipPage"
@JvmStatic
fun gotoVipPage(context: Context) {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("route://open.my.app")
intent.putExtra(gotoVipPage, gotoVipPage)
if (intent.resolveActivity(context.packageManager) != null) {
context.startActivity(intent)
} else {
Log.i("xx", "不支持该跳转")
}
}
}
Quelques autres bibliothèques
Ce qui précède ne présente que quelques principes de base. Si vous êtes paresseux pour créer des packages, vous pouvez également utiliser directement les bibliothèques d'autres personnes, choisissez simplement en fonction de vos propres besoins, tels que ARouter, Airbnb DeepLinkDispatch