通过清单上的别名打开活动时崩溃

时间:2016-01-11 20:29:20

标签: android android-manifest

我有一个专门的网络浏览器的应用程序。许多用户要求将其列为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>

3 个答案:

答案 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属性中。