伴随对象 - Android 是不是希望将它们注册为活动 (?)

Posted

技术标签:

【中文标题】伴随对象 - Android 是不是希望将它们注册为活动 (?)【英文标题】:Companion objects - does Android want to register them as activities (?)伴随对象 - Android 是否希望将它们注册为活动 (?) 【发布时间】:2017-08-26 12:21:44 【问题描述】:

我有一个活动

class DummyActivity : Activity() 

    companion object 
        @JvmStatic fun onNewIntent(context: Context): Intent 
            val intent = Intent(context, DummyActivity.javaClass)
            return intent
        
    

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    

在Manifest中声明如下:

    <activity android:name=".DummyActivity"/>
</application>

当我尝试启动它时,我得到:

原因:android.content.ActivityNotFoundException:无法找到明确的活动类> com.example.andrzejzuzak.visiondummyapp/com.example.andrzejzuzak.visiondummyapp.DummyActivity$Companion;您是否在 AndroidManifest.xml 中声明了此活动? 在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1794) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1512) 在 android.app.Activity.startActivityForResult(Activity.java:3930) 在 android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 在 android.app.Activity.startActivityForResult(Activity.java:3890) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 在 android.app.Activity.startActivity(Activity.java:4213) 在 android.app.Activity.startActivity(Activity.java:4181) 在 com.example.andrzejzuzak.visiondummyapp.MainActivity.onActivityResult(MainActivity.kt:85) 在 android.app.Activity.dispatchActivityResult(Activity.java:6456) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 在 android.app.ActivityThread.-wrap16(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(Native Method)

困扰我的是这行:

找不到明确的活动类 com.example.andrzejzuzak.visiondummyapp/com.example.andrzejzuzak.visiondummyapp.DummyActivity$Companion

这是否真的意味着我必须在某处注册 Companion 对象?

【问题讨论】:

你应该改用Intent(context, DummyActivity::class.java) 不相关:Activity 已经有一个onNewIntent 方法,也许您想将您的工厂方法重命名为简单易懂的名称,例如createIntent。 (这不是回调,它不是以on 开头的。)为未来的自己留点时间。 【参考方案1】:

DummyActivity.javaClass 指的是DummyActivity.Companion 而不是DummyActivity。事实上,这甚至是一个警告:

javaClass 调用的结果类型是 Class&lt;Dummy.Companion&gt; 而不是 Class&lt;Dummy&gt;。请使用更清晰的 ::class.java 语法以避免混淆。

相反,您应该使用DummyActivity::class.java

【讨论】:

在这种情况下@JvmStatic 是什么?并感谢您的回答! 刚刚复制了问题的代码。简而言之,@jvmStatic 告诉编译器在 JVM 平台上将此方法设为静态。 如果使用了@jvmstatic,为什么在伴生对象内部,上面的代码不是说onNewIntent()是Dummy内部伴生对象的静态方法,而不是@987654333的静态方法@

以上是关于伴随对象 - Android 是不是希望将它们注册为活动 (?)的主要内容,如果未能解决你的问题,请参考以下文章

Android 小部件 - 在哪里注册显式广播

为什么Android + Kotlin中newStartIntent的伴随对象?

使用注册表单而不是 API 将 MailChimp 订阅者添加到组

如何批量更新用户类(Parse.com、Android)中的所有对象?

将自定义对象存储到 Android 内部存储的最佳方式?

发现 Android 活动是不是正在运行