标签: android-bundle

通过bundle检索parcelable对象是否始终创建新副本?

我通过在创建片段时添加到一个包中将一个parcelable对象传递给一个片段.在onc实例中,对此parceled对象的修改反映了原始对象的修改,而在另一种情况下则不是.我对这种行为感到有点困惑.直到现在我已经假设通过一个包检索一个包围的对象总是创建一个新对象[不确定它是浅拷贝还是深拷贝].

有人请澄清可怜行为.

android parcelable android-fragments android-bundle

12
推荐指数
1
解决办法
1354
查看次数

通过在bundle中传递新数据来恢复旧活动

我有几个活动说A,B,C.活动A开始B,B开始C,依此类推.在我的应用程序中,我放置了一个导航抽屉,允许用户返回活动A.当用户返回活动时,AI已经传递了一些标志,这些标志实际上没有重新启动活动但只是恢复它.

intent = new Intent(activity, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Run Code Online (Sandbox Code Playgroud)

现在我试图使用bundle传递一些数据.

    bundle.putInt("selectedTab", FEATURED_COUPONS);
    intent.putExtras(bundle);
Run Code Online (Sandbox Code Playgroud)

但在我的活动A中,bundle总是为null.

if(bundle != null)
{
    if(bundle.containsKey("selectedTab"))
    {
        int tab = bundle.getInt("selectedTab");
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-intent android-activity android-bundle

11
推荐指数
1
解决办法
6067
查看次数

在Android中的Bundle中存储和检索数组列表

如何Bundle在Android中存储和检索数组的值列表?任何例子?

android android-bundle

10
推荐指数
1
解决办法
3万
查看次数

Android App Bundle构建错误:保留文件

新的应用发布格式Android App Bundle是一种改进的应用程序打包方式.Android App Bundle让您可以更轻松地以更小的应用程序大小提供出色的体验,从而支持当今各种各样的Android设备.您无需重构代码即可从较小的应用程序中受益.

我试图构建我的应用程序Android Bundle时遇到此错误:

文件'root/AndroidManifest.xml'使用保留文件或目录名'AndroidManifest.xml'.

APK生成工作正常.

这是我的项目文件结构:

在此输入图像描述

这是我的AndroidManifest.xml,位于{ProjectName}/app/src/main:

<?xml version="1.0" encoding="utf-8"?>
            <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                package="com.XXXX.XXXX"
                android:installLocation="auto">

                <uses-permission android:name="android.permission.INTERNET" />
                <uses-permission android:name="android.permission.WAKE_LOCK" />
                <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

                <!-- These permissions are strongly recommended and will result in higher performance -->
                <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
                <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
                <uses-permission android:name="android.permission.VIBRATE" />

                <application
                    android:name="com.app.webview.Application"
                    android:allowBackup="true"
                    android:icon="@mipmap/ic_launcher"
                    android:label="@string/app_name"
                    android:supportsRtl="true"
                    android:theme="@style/AppTheme"
                    android:hardwareAccelerated="true">
                    <activity
                        android:name="com.app.webview.MainActivity"
                        android:configChanges="keyboardHidden|orientation|screenSize"
                        android:label="@string/app_name"
                        android:launchMode="singleTask">
                        <intent-filter>
                            <action android:name="android.intent.action.MAIN" />

                            <category android:name="android.intent.category.LAUNCHER" />
                        </intent-filter>

                        <!-- Universal APP Link …
Run Code Online (Sandbox Code Playgroud)

android android-bundle

10
推荐指数
3
解决办法
3197
查看次数

将接口放在bundle中以启动新活动

我需要从具有两个不同模型的两个不同屏幕开始一个活动,但是,两个模型都有一些共享信息,这是我在新活动中需要的信息.问题是我无法使这些模型从同一父模型扩展,因为其中一个模型已经扩展了一个父模型.我曾考虑创建一个包含共享方法的接口,但是,如果我这样做,那么如何将该接口放入启动下一个活动所需的包中?

我添加了一些简化的代码以澄清我的情况:

public class A extends Model implements CustomInterface {
    String name;
    String address;

    public String getName(){
        return name;
    }

    public String getAddress() {
        return address;
    }
}

public class B implements CustomInterface {
    String name;

    public String getName() {
        return name;
    }
}

public interface CustomInterface {
    String getName();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要使用包含两个模型之间共享信息的包来启动活动.所以,我想把CustomInterface放在一个包中.我怎么能这样做?

提前致谢.

android interface android-activity android-bundle

9
推荐指数
1
解决办法
6355
查看次数

Android的Kotlin扩展:如何使用bundleOf

文件说:

fun bundleOf(vararg pairs: Pair<String, Any?>): Bundle
Run Code Online (Sandbox Code Playgroud)

返回一个新的Bundle,其中给定的键/值对作为元素.

我试过了:

   val bundle = bundleOf {
       Pair("KEY_PRICE", 50.0)
       Pair("KEY_IS_FROZEN", false)
   }
Run Code Online (Sandbox Code Playgroud)

但它显示错误.

android kotlin android-bundle android-ktx

9
推荐指数
3
解决办法
1878
查看次数

X类不是抽象的,并且没有实现android.os.Parcelable中定义的有趣的writeToParcel()

在我的Android应用中,我想Place向我的Intent 添加一个Bundle,其中包括如下所述的对象。由于可序列化很慢并且不建议使用,因此我更喜欢使用Parcelable。

Althoug我使用Kotlin 1.3.31,在打包某些数据类时遇到问题。例:

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class Place(val street: String, val postal: String, val city: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)

和Android Studio抱怨:

类'Place'不是抽象的,并且没有实现抽象成员public abstract fun writeToParcel(p0:Parcel !, p1:Int):android.os.Parcelable中定义的单位

根据一些教程

而已!您不再需要编写任何包裹方法!

https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220

而且我不想使用

androidExtensions {
    experimental = true
}
Run Code Online (Sandbox Code Playgroud)

生产中的东西。

我在这里有什么选择?

android parcelable android-bundle kotlin-android-extensions kotlinx.serialisation

9
推荐指数
1
解决办法
2344
查看次数

使用 Hermes 反汇编 index.android.bundle 的 React-native 0.61.2

我使用 react-native 0.61.2 创建了我的应用程序的发布版本并启用了 Hermes。在我的 Crashlytics 中,我收到有关崩溃的信息以及堆栈跟踪。以前我曾经应用 apktool 从我的 apk 中提取 index.android.bundle,它包含我能够通过堆栈跟踪找到问题的 js 代码。

但是现在使用 Hermes index.android.bundle 似乎包含字节码而不是 js,我浪费了一天试图反汇编它。我尝试的最后一件事是https://github.com/facebook/hermes/blob/master/doc/BuildingAndRunning.md 中提到的hbcdump工具,但我得到的只是“错误:无法反序列化字节码:错误的字节码版本。预期73 但得到了 62"

我应该怎么做才能反汇编用 Hermes 创建的 index.android.bundle?任何帮助表示高度赞赏!

android disassembly android-bundle react-native react-native-hermes

9
推荐指数
1
解决办法
1916
查看次数

通过 NavDeepLinkBuilder 的 PendingIntent 发送参数

我在PendingIntent使用NavDeepLinkBuilder. 我可以Activity通过单击通知来启动目标,但是Activity'sIntent不包含我通过NavDeepLinkBuilder. 将Intent代替返回defaultValue在导航图中,我设定- “noJobId”。

通知创建

val notification =
    NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
        ...
        .setContentIntent(
            NavDeepLinkBuilder(context)
                .setComponentName(NewJobDetailsActivity::class.java)
                .setGraph(R.navigation.main_graph)
                .setDestination(R.id.newJobDetailsActivity)
                .setArguments(
                    NewJobDetailsActivityArgs.Builder()
                        .setJobId(event.jobId)
                        .build()
                        .toBundle()
                )
                .createPendingIntent()
        )
        .build()

notificationManager.notify(notificationId, notification)
Run Code Online (Sandbox Code Playgroud)

context通知中使用的是FirebaseMessagingService

目的地Activity onCreate():

val jobId: String = NewJobDetailsActivityArgs.fromBundle(intent?.extras).jobId
Run Code Online (Sandbox Code Playgroud)

main_graph.xml导航图

<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_graph"
    app:startDestination="@id/jobsFragment">

    <fragment
        android:id="@+id/jobsFragment"
        android:name=".ui.jobs.JobsFragment"
        android:label="JobsFragment">

        <action
            android:id="@+id/action_jobsFragment_to_newJobDetailsActivity"
            app:destination="@id/newJobDetailsActivity" />

    </fragment>

    <fragment
        android:id="@+id/historyFragment"
        android:name=".ui.history.HistoryFragment"
        android:label="HistoryFragment" …
Run Code Online (Sandbox Code Playgroud)

android android-notifications android-activity android-bundle android-architecture-navigation

8
推荐指数
1
解决办法
6504
查看次数

如何在android导航组件中传递参数名称?

我正在使用导航图在片段之间导航。一切正常,但我想知道如何以优雅的方式传递参数名称。

这是我的代码片段navSheet.xml

源片段动作:

    <action
        android:id="@+id/action_go_to_B"
        app:destination="@id/id_fragment_b">
        <argument
            android:name="@string/fragment_b_arg_key_name"
            app:argType="integer"/>
    </action>
Run Code Online (Sandbox Code Playgroud)

目标片段:

<fragment
    android:id="@+id/id_fragment_b"
    android:name="pl.asd.FragmentB"
    tools:layout="@layout/fragment_b">

    <argument
        android:name="@string/fragment_b_arg_key_name"
        app:argType="integer"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)

我将我的参数键存储在string.xml

<string name="fragment_b_arg_key_name" translatable="false">arg_fragment_b</string>
Run Code Online (Sandbox Code Playgroud)

最后,我尝试在目标片段中得到我的论点:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            selectedId = it.getInt(getString(R.string.fragment_b_arg_key_name))
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题在于android:name="@string/fragment_b_arg_key_name". 我在调试器上看到捆绑包密钥不正确。它应该是这样的:

Bundle[{arg_fragment_b=-730732511}]

但我得到:

Bundle[{@string/fragment_b_arg_key_name=-730732511}]

两个问题:

  1. 在 navSheet.xml 中使用 a 有什么问题@string/fragment_b_arg_key_name,因此它不返回内容,@string/fragment_b_arg_key_name而是返回原始引用。

  2. 如何不对我在片段navSheet.xml和其他类中使用的参数名称进行硬编码?如何将这些密钥存储在一个地方?

xml android android-resources android-bundle android-architecture-navigation

8
推荐指数
1
解决办法
8489
查看次数