【问题标题】:service cannot be cast to android.app.Activity服务无法转换为 android.app.Activity
【发布时间】:2017-11-13 21:45:23
【问题描述】:

我正在尝试访问服务中的 editText 和 Button。 我见过this answerthis 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 - 阅读ServiceActivity 的文档
  • 但根据this answer,他说可以做到。它也被接受了。

标签: java android android-intent service android-context


【解决方案1】:

你叫错了树 ;-) 你的 Service 不应该对你的 UI 有任何了解,也不应该想弄乱它。如果您想从 Service 更改 UI,则需要将该任务委托给 ActivityActivity 负责 UI。您可以使用几种有据可查的方法:

  • Activity 绑定到 ServiceServiceActivity 上执行回调
  • Service 发送广播 IntentActivity 注册一个侦听器,该侦听器在广播时对 Intent 作出反应
  • 使用事件总线实现

【讨论】:

    【解决方案2】:

    服务不是活动。服务没有与之相关的 UI。

    所以:

    1) 您不能将服务投射到活动中。 2) 在您的服务中没有 UI 供您查找。

    为什么服务需要一个按钮?服务在后台运行,无需用户交互。

    我不知道你在做什么,但在 Android 中它是这样工作的:

    1) 活动启动服务(例如按下按钮) 2)服务在后台执行任务 3)服务向活动报告或终止

    【讨论】:

    • 我想在用户点击停止按钮时停止服务。我怎么知道什么时候打电话给stopSelf()
    • 虽然你的回答很好解释了为什么我不能做我想做的事。
    • @NikhilWagh - Chris Merrick 的说法是正确的,但我重申,您开始提出原始帖子范围之外的问题,请阅读 Service 的文档 - @ 987654321@(值得一读!)Java 异常告诉你为什么你不能做你正在尝试的事情——你指出的接受的答案是完全错误的。
    • 我们应该标记那个答案然后@MarkKeen
    猜你喜欢
    • 2019-01-09
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多