【问题标题】:Passing data from Activity A to Service B to Activity C将数据从活动 A 传递到服务 B 到活动 C
【发布时间】:2013-10-07 15:49:50
【问题描述】:

我想将数据从活动 A 传递到服务 B,即 userNamephoneNumber。 在服务 B 中,仅使用 phoneNumber(此处电话号码很重要)并生成 randomNumber。从Service B传递给Activity C的数据是userNamephoneNumberrandomNumber

我正在尝试使用下面给出的这段代码,但它不起作用。

在活动 A 中:

Intent goToServiceB = new Intent(getApplicationContext(),ServiceB.class);
goToServiceB.putExtra("passedPhoneNumberAtoS", phoneNumberStr);
goToServiceB.putExtra("passedUserNameAtoS", userNameStr);
startService(goToServiceB);

在服务 B 中:

public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    String phoneNumber = intent.getStringExtra("passedPhoneNumberAtoS");
    String userName = intent.getStringExtra("passedUserNameAtoS");
    return Service.START_NOT_STICKY;
}

在服务 B 本身还有另一个意图:

Intent goToActivityC = new Intent(getApplicationContext(),ActivityC.class);
goToActivityC.putExtra("passedPhoneNumberStoA", phoneNumberStr);
goToActivityC.putExtra("passedUserNameStoA", userNameStr);
goToActivityC.putExtra("passedRandomNumberStoA", RandomNumberStr);
startactivity(goToActivityC);

在活动 C 中:

Intent intent=new Intent();
String phoneNumber = intent.getStringExtra("passedPhoneNumberStoA");
String userName = intent.getStringExtra("passedUserNameStoA");
String RandomNumber=intent.getStringExtra("passedRandomNumberStoA");

我的日志猫:

08-03 14:19:42.882: E/Trace(1923): error opening trace file: No such file or directory        (2)
08-03 14:19:44.983: D/gralloc_goldfish(1923): Emulator without GPU emulation detected.
08-03 14:19:45.153: W/IInputConnectionWrapper(1923): showStatusIcon on inactive   InputConnection
08-03 14:19:47.792: D/dalvikvm(1923): GC_CONCURRENT freed 84K, 7% free 2765K/2972K, paused 79ms+46ms, total 236ms
08-03 14:20:03.792: D/dalvikvm(1923): GC_FOR_ALLOC freed 54K, 6% free 2931K/3104K, paused 36ms, total 57ms
08-03 14:20:03.812: I/dalvikvm-heap(1923): Grow heap (frag case) to 4.050MB for 1127536-byte allocation
08-03 14:20:03.964: D/dalvikvm(1923): GC_FOR_ALLOC freed 50K, 6% free 3982K/4208K, paused 152ms, total 152ms
08-03 14:20:04.113: D/dalvikvm(1923): GC_CONCURRENT freed 1K, 6% free 3987K/4208K, paused 4ms+97ms, total 154ms 
08-03 14:20:04.202: D/AndroidRuntime(1923): Shutting down VM
08-03 14:20:04.202: W/dalvikvm(1923): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
08-03 14:20:04.232: E/AndroidRuntime(1923): FATAL EXCEPTION: main
08-03 14:20:04.232: E/AndroidRuntime(1923): java.lang.IllegalStateException: Could not execute method of the activity
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.View$1.onClick(View.java:3599)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.View.performClick(View.java:4204)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.View$PerformClick.run(View.java:17355)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.os.Handler.handleCallback(Handler.java:725)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.os.Looper.loop(Looper.java:137)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at java.lang.reflect.Method.invokeNative(Native Method)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at java.lang.reflect.Method.invoke(Method.java:511)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at dalvik.system.NativeStart.main(Native Method)
08-03 14:20:04.232: E/AndroidRuntime(1923): Caused by: java.lang.reflect.InvocationTargetException
08-03 14:20:04.232: E/AndroidRuntime(1923):     at java.lang.reflect.Method.invokeNative(Native Method)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at java.lang.reflect.Method.invoke(Method.java:511)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.View$1.onClick(View.java:3594)
08-03 14:20:04.232: E/AndroidRuntime(1923):     ... 11 more
08-03 14:20:04.232: E/AndroidRuntime(1923): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at android.app.Dialog.show(Dialog.java:281)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at com.beproject.groupmessenger.UserRegistration.showAlert(UserRegistration.java:91)
08-03 14:20:04.232: E/AndroidRuntime(1923):     at com.beproject.groupmessenger.UserRegistration.submit(UserRegistration.java:97)
08-03 14:20:04.232: E/AndroidRuntime(1923):     ... 14 more

有人可以为上述问题提供一个简单的解决方案吗?我进行了很多搜索,但无法获得可以理解的解决方案。

【问题讨论】:

  • “它不起作用”是什么意思?数据在哪里丢失?
  • 我的 AVD 在第一次活动后显示强制关闭错误
  • 你的 logcat 说什么?
  • 1>java.lang.IllegalStateException: 在视图类 android.widget.Button 上的 onClick 处理程序的活动类 com.beproject.groupmessenger.UserRegistration 中找不到方法 submit(View) id ' register' 2>错误打开跟踪文件:没有这样的文件或目录(2)
  • 这个错误表明问题与你的数据传递代码完全无关。听起来您在 XML 中定义了一个带有 onclick="submit" 的 Button,但相关的 Activity 缺少 submit(View) 方法。

标签: android android-intent android-activity android-service


【解决方案1】:

java.lang.IllegalStateException:在 id 为“register”的视图类 android.widget.Button 上的 onClick 处理程序的活动类 com.beproject.groupmessenger.UserRegistration 中找不到方法 submit(View)

来自您的 logcat 的错误表明该问题与您的数据传递代码无关。

此错误表明您在 XML 中为您的UserRegistration 活动定义了一个带有android:id="@+id\register" 的按钮,该活动还具有一个设置为android:onclick="submit" 的点击处理程序。但是,Android 在UserRegistration Activity 中找不到submit(View) 方法,因此崩溃并出现此错误。

确保UserRegistration Activity 有一个公共的submit(View) 方法,并且应用程序不应再崩溃。

【讨论】:

    【解决方案2】:

    在服务 B 中,您可以获取额外内容并将它们存储在 local 字符串变量中。这些变量在您从该服务中的onStartCommand() 返回后消失。所以,无论你传递给 Activity C 的东西,都不是你从传递给 ServiceB.onStartCommand() 的 Intent 中得到的东西

    您应该有两个服务类私有的字符串变量,并将附加内容提取到它们。

    编辑:现在使用 logcat,错误变得更加清晰。您在布局中定义一个 id 为“注册”的按钮。对于此按钮,您使用android:onClick 定义以调用活动UserRegistration 中的方法submit()。该方法不存在。

    您必须在 UserRegistration 中将此方法实现为 public void submit(View view); 才能调用它。 Android 无法检测到这个缺失的方法(或.mispelled 或 ...),因为它在运行时使用 Java 反射。

    【讨论】:

    • 即使在将变量声明为服务类私有后也出现同样的错误
    • 我看到了 logcat 和第一个错误。按照建议更改酸代码,然后再次检查 logcat。如果这个错误消失了,你cm检查下一个。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2018-07-10
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多