伴随对象 - 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<Dummy.Companion>
而不是Class<Dummy>
。请使用更清晰的::class.java
语法以避免混淆。
相反,您应该使用DummyActivity::class.java
,
【讨论】:
在这种情况下@JvmStatic 是什么?并感谢您的回答! 刚刚复制了问题的代码。简而言之,@jvmStatic
告诉编译器在 JVM 平台上将此方法设为静态。
如果使用了@jvmstatic,为什么在伴生对象内部,上面的代码不是说onNewIntent()
是Dummy内部伴生对象的静态方法,而不是@987654333的静态方法@以上是关于伴随对象 - Android 是不是希望将它们注册为活动 (?)的主要内容,如果未能解决你的问题,请参考以下文章
为什么Android + Kotlin中newStartIntent的伴随对象?
使用注册表单而不是 API 将 MailChimp 订阅者添加到组