【问题标题】:How to specify a full android package name for external apps using Xamarin Forms?如何使用 Xamarin Forms 为外部应用程序指定完整的 android 包名称?
【发布时间】:2019-12-10 07:03:30
【问题描述】:

我在使用 Xamarin Forms 创建小部件配置活动时遇到问题。我认为正在发生的事情是,在编译时,包的名称会被主要活动的随机 #/string 替换。但是,如果我检查生成的 APK,我可以看到 <appwidget-provider ... android:configure="my.package.myClass".../> 没有得到更新。我认为应该是<appwidget-provider ... android:configure="randomstring.myClass".../>。所以我相信这会阻止配置屏幕出现。有没有办法强制使用 Xamarin 更新此属性上的包名称?或者有没有办法在小部件放置期间调用此属性之前在代码中设置此属性?

这是我的配置(包名已被简化以帮助调试):

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="288dip"
    android:minHeight="72dip"
    android:resizeMode="horizontal"
    android:minResizeWidth="144dip"
    android:updatePeriodMillis="1000"
    android:initialLayout="@layout/Widget"
    android:previewImage="@drawable/previewImage"
    android:configure="quickclip.QuickClipConfigActivity"

/>
namespace quickclip
{
    [Activity(Label = "QuickClipConfigActivity", Name= "quickclip.QuickClipConfigActivity", Exported=true )]
    [IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_CONFIGURE" })]
    public class QuickClipConfigActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Setup);
            SetResult(Result.Canceled);


            // Create your application here
        }
    }
}

[Activity] 属性的名称字段只是为了调试目的而添加的。不管有没有它,放置小部件都不会显示配置屏幕,也不会进入活动类(通过断点验证),小部件也不显示。但是,如果我删除 android:configure="my.package.myClass" 我可以让小部件正常显示。

【问题讨论】:

  • TBH你的问题很模糊,我无法理解你的问题是什么,是活动属性还是IDK,你能给我一个问题的要点吗?

标签: android xamarin xamarin.forms android-widget


【解决方案1】:

如果您没有明确指定它,Xamarin.Android 将计算一些 MD5 并使用它为所有 Android Callable Wrapper 加上该 MD5 作为命名空间的前缀。

为避免这种情况,您可以在类型上使用 RegisterAttribute

[Register("my.cool.namespace.MyType")]
public class MyType : SomeJavaType
{
}

对于ActivityService,您可以使用ActivityAttributeServiceAttribute 中的Name 属性,如下所示:

[Activity(Label = "My Activity", Name = "my.cool.namespace.MyActivity")]
public class MyActivity : Activity
{
}

或者您可以将ActivityAttributeRegisterAttribute 结合使用:

[Register("my.cool.namespace.MyActivity")]
[Activity(Label = "My Activity")]
public class MyActivity : Activity
{
}

这应该会在您的 AndroidManifest 中生成一个很好的条目,该条目很容易从布局文件或其他应用程序/小部件中使用。

【讨论】:

  • Activity 上的 [Register] 属性就像一个魅力,解决了许多小时的挫败感。非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多