Как я могу передать значение флажка в действии службе? - PullRequest
1 голос
/ 19 июня 2011

В моей основной деятельности есть три флажка. Я хочу, чтобы можно было передать, отмечены ли эти флажки для службы при нажатии кнопки «Отправить». Вот мой код:

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)

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

выполните следующие шаги

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> 
0 голосов
/ 19 июня 2011

Возможно, вам понадобится:

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

Я могу ошибаться, но добавление имени вашего пакета - это просто хороший стандарт, а не требование.

...