Saut de page sous plusieurs modules

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.demofaire 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, permissionet uses-permissionsont 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)
    }
}

PageReceiverImplé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 ContentResolverpour 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' AndroidManifestenregistrement 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

Je suppose que tu aimes

Origine blog.csdn.net/Ser_Bad/article/details/106687720
conseillé
Classement