服务无法转换为android.app.Activity

时间:2017-11-13 21:45:23

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

我正在尝试访问服务中的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:致命异常:主要                                                    处理:com.example.nwagh.myapplication,PID:5906                                                    java.lang.RuntimeException:无法启动服务   com.example.nwagh.myapplication.MyService@32189af with 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)                                                        at java.lang.reflect.Method.invoke(Native Method)                                                        在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)                                                        at java.lang.reflect.Method.invoke(Native Method)                                                        在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:无法获取   MQSService。

如果您需要更多参考,

Here是完整的代码。

2 个答案:

答案 0 :(得分:3)

你正在咆哮错误的树;-)你的Service不应该知道你的用户界面,也不应该想知道它。如果您想从Service更改用户界面,则需要将该任务委派给ActivityActivity负责用户界面。您可以使用几种记录良好的方法:

  • Activity绑定到ServiceService执行Activity
  • 上的回调
  • Service向广播IntentActivity发送一个监听器,该监听器在广播时对Intent作出反应
  • 使用事件总线实施

答案 1 :(得分:1)

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

所以:

1)您无法向某项活动投放服务。 2)您的服务中没有用户界面。

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

我不知道你在做什么,但在Android中它的工作原理如下:

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