我有一个专门的网络浏览器的应用程序。许多用户要求将其列为Android上的浏览器,但我认为这是非常具有侵入性的,因为它不是通用浏览器。所以我所做的是使用activity-alias
创建一个组件并默认禁用它,然后用户可以选择是否启用它。这就是我的别名:
<activity-alias
android:name="MyComponentName"
android:enabled="false"
android:exported="true"
android:targetActivity=".MyMainActivity">
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"></category>
<data android:scheme="http"/>
<data android:scheme="https"/>
</intent-filter>
</activity-alias>
无论如何,我已经在几个Android版本上对它进行了测试,但它运行正常,但我在Crashlytics上遇到了一些崩溃,看起来像这样:
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage/mypackage.MyMainActivity}: java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage/MyComponentName}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage/MyComponentName}
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:284)
at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:152)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:60)
at mypackage.MyMainActivity.onCreate(MyMainActivity.java:330)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage/MyComponentName}
at android.app.ApplicationPackageManager.getActivityInfo(ApplicationPackageManager.java:314)
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:301)
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:281)
at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:152)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:60)
at mypackage.MyMainActivity.onCreate(MyMainActivity.java:330)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
知道我可能做错了什么吗?它在我的代码中崩溃的行是super.onCreate()
上的MyMainActivity
。
感谢。
编辑:MyMainActivity的清单部分
第二次修改:将android:name="MyMainActivity"
更改为.
之前MyMainActivity
,但它没有解决问题。
<activity
android:name=".MyMainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
.... a bunch of other filters
</activity>
答案 0 :(得分:1)
您的清单未定义活动的完整包名称。 manifest documentation表示name属性应该是完整的类名,或者以句点开头(用应用程序的包名替换)。
您可以通过将清单声明更改为以下格式之一来修复崩溃:
android:name=".MyMainActivity"
android:name="com.example.myapp.mypackage.MyMainActivity"
答案 1 :(得分:1)
我想我发现了这个问题。在某些条件下,onCreate
类的Application
会在onCreate
上的Activity
有机会启动之前禁用该组件,即使在开始使用该条件时也是如此组件别名。
答案 2 :(得分:0)
我认为应用程序没有找到您创建的活动别名的路径。尝试将.MyComponentName放在activity-alias中的name属性中。