【发布时间】:2017-11-13 21:45:23
【问题描述】:
我正在尝试访问服务中的 editText 和 Button。 我见过this answer 和this answer,并试图合并和解决,但没有收获。我在这里想念什么?我也看到了其他类似的答案,并且从过去 2 天开始一直试图完成它,但都是徒劳的。任何其他实现它的方式也将受到欢迎。
以下是相关代码:
MainActivity.java
btn_start.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View view) {
startService(new Intent(getApplicationContext(), MyService.class));
}
});
MyService.java
Context context = MyService.this;
Activity activity = (Activity) context;
Button stopButton = activity.findViewById(R.id.btn_stop);
EditText editTextUsername = activity.findViewById(R.id.edit_name);
AndroidManifest.xml
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
但我收到此错误: LOGCAT
11-14 02:55:07.835 5906-5906/? E/AndroidRuntime: 致命异常: main 进程:com.example.nwagh.myapplication,PID:5906 java.lang.RuntimeException:无法启动服务 com.example.nwagh.myapplication.MyService@32189af 与 Intent { cmp=com.example.nwagh.myapplication/.MyService }: java.lang.ClassCastException: com.example.nwagh.myapplication.MyService 无法转换为 android.app.Activity 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3060) 在 android.app.ActivityThread.access$2300(ActivityThread.java:153) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:5527) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 引起:java.lang.ClassCastException: com.example.nwagh.myapplication.MyService 无法转换为 android.app.Activity 在 com.example.nwagh.myapplication.MyService.onStartCommand(MyService.java:68) 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3043) 在 android.app.ActivityThread.access$2300(ActivityThread.java:153) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:5527) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 11-14 02:55:07.844 5906-5906/? E/MQSEventManagerDelegate: 获取失败 MQS 服务。
Here 是完整的代码,如果您需要更多参考。
【问题讨论】:
-
那么这其中的哪一部分:
Context context = MyService.this; Activity activity = (Activity) context;没有意义?您正在将Activity转换为context对象,您刚刚将其分配为您的Service实例?此外,您正在尝试访问服务中的 Activity/UI 元素 - 这必然会导致更多问题。 -
那我该怎么办?我无法将服务投射到活动中。
-
您应该将您的服务绑定到您的活动。然后在服务内部,创建一个接受您的活动的方法。这样您就可以在服务内使用活动的字段和方法
-
不,它们是不同的对象类型,都从
Context扩展,但不兼容,因此ClassCastException- 阅读Service和Activity的文档 -
但根据this answer,他说可以做到。它也被接受了。
标签: java android android-intent service android-context