【问题标题】:How can I pass the value of a checkbox in an activity to a service?如何将活动中复选框的值传递给服务?
【发布时间】:2011-06-19 04:09:14
【问题描述】:

我的主要活动中有三个复选框。当按下“提交”按钮时,我希望能够将这些复选框是否被选中到服务。这是我的代码:

public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent start_service = new Intent();
        start_service.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        start_service.setClass(getApplicationContext(), FollowService.class);

        if( box1.isChecked() ){
            boxes[0] = 1;
        }
        if( box2.isChecked() ){
            boxes[1] = 1;
        }
        if( box3.isChecked() ){
            boxes[2] = 1;
        }

        start_service.putExtra("com.mypackage.boxes", selections);
        box1.setChecked(false);
        box2.setChecked(false);
        box3.setChecked(false);
        getApplicationContext().startService(start_service);
    }

然后我尝试通过执行以下操作来访问我试图传递给 onStartCommand 内部服务的这个数组:

public int onStartCommand(Intent intent, int flags, int startID){
    try {
        Bundle selections = intent.getExtras();
        int [] boxes = selections.getIntArray("boxes");

        if( boxes[0] == 1 ){
            // do something
        }
        if( boxes[1] == 1 ){
            // do something             
        }
        if( boxes[1] == 1 ){                                 // do something
        }

        checkWebsite();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return START_STICKY;
}

当我按下“提交”按钮时,我的应用程序将启动并且不会强制关闭我,但我在 LogCat 中收到一条 system.err 消息。

这是我在尝试启动服务时收到的 LogCat 错误消息。

06-19 04:20:51.514: WARN/System.err(300): java.lang.NullPointerException
06-19 04:20:51.536: WARN/System.err(300):     at com.mypackage.FollowService.onStartCommand(FollowService.java:60)
06-19 04:20:51.536: WARN/System.err(300):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
06-19 04:20:51.544: WARN/System.err(300):     at android.app.ActivityThread.access$3600(ActivityThread.java:125)
06-19 04:20:51.544: WARN/System.err(300):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
06-19 04:20:51.554: WARN/System.err(300):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-19 04:20:51.554: WARN/System.err(300):     at android.os.Looper.loop(Looper.java:123)
06-19 04:20:51.554: WARN/System.err(300):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-19 04:20:51.574: WARN/System.err(300):     at java.lang.reflect.Method.invokeNative(Native Method)
06-19 04:20:51.574: WARN/System.err(300):     at java.lang.reflect.Method.invoke(Method.java:521)
06-19 04:20:51.574: WARN/System.err(300):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-19 04:20:51.574: WARN/System.err(300):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-19 04:20:51.584: WARN/System.err(300):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android service android-intent


    【解决方案1】:

    按照以下步骤进行

    1) 创建一个类文件名 first.java 并编写如下代码

    package com.example.bundle;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    
    public class first extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Intent intent = new Intent(this, second.class);
            int[] arr = new int[3];
            arr[0]=0;
            arr[1]=1;
            arr[2]=2;
            Bundle bundle = new Bundle();
            bundle.putIntArray("arr", arr);
            intent.putExtras(bundle);
            startService(intent);
        }
    }
    

    2) 创建一个服务名 second.java 并放在下面的代码

    package com.example.bundle;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.widget.Toast;
    
    public class second extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
            public int onStartCommand(Intent intent, int flags, int startId) {
             Bundle bundle = intent.getExtras();
                int[] arr = bundle.getIntArray("arr");
                Toast.makeText(second.this, "" + arr[0] + " " + arr[1] + " " + arr[2], Toast.LENGTH_LONG).show();
                return super.onStartCommand(intent, flags, startId);
            }
    }
    

    3) 像这样表现出来

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.bundle"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".first" android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name=".second" android:label="@string/app_name">
    
            </service>
        </application>
    
    
    </manifest> 
    

    【讨论】:

    • 我仍然收到空指针异常。我在想我在做一些非常愚蠢的事情,但我当然不知道那是什么。
    • 我已经为你的问题举了一个小例子试试
    • 谢谢 Jackal 博士。我终于能够试用您的示例,它的工作原理与宣传的完全一样。
    【解决方案2】:

    您可能需要这样做:

    selections.getIntArray("com.mypackage.boxes")
    

    我可能是错的,但添加你的包名只是一个很好的标准,而不是要求。

    【讨论】:

    • 我将代码更改为该代码,但仍然收到相同的 LogCat 错误。我认为原因是我没有正确传递意图或没有正确访问它或两者兼而有之。
    • 是的,该服务是在那里定义的,并且在我尝试添加此功能之前一直在工作。我正在考虑切换到 SharedPreferences,因为我不知道如何传递数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多