2

サービスを開始する活動があります。たとえば、次のように述べMyServiceています。

Intent intent1 = new Intent(this, MyService.class);
startService(intent1);

サービス内でスレッドを作成して実行します。ここに私のコードの一部があります:

public class MyService extends Service {
...
@Override
public void onStart(Intent intent, int startid) {
    Thread mythread= new Thread() {
        @Override
        public void run() {
            while(true)
            {
              ...
            }
        }
    };
    mythread.start();
}

}

while(true)を使用する代わりに、while(a)aアクティビティからこのサービスに渡されるパラメーターです。私の活動は私のサービスとは異なるクラスであることに注意してください。これはどのように行うことができますか?いくつかのコードで具体的な例を示してください。

4

5 に答える 5

2

あなたはそれにバインドすることによってあなたのサービスへのアクセスを得ることができます。IBinder onBind()を返すようにサービスクラスを編集します

public class MyService extends Service {

    private static final String TAG = MyService.class.getSimpleName();
    private final IBinder binder = new ServiceBinder();
    private boolean a;

    @Override
    public IBinder onBind( Intent intent ) {

        return binder;
    }

    @Override
    public int onStartCommand( Intent intent, int flags, int startId ) {

        return super.onStartCommand( intent, flags, startId );
    }

    @Override
    public void onCreate() {

        super.onCreate();
    }

    public class ServiceBinder extends Binder {

        public MyService getService() {

            return MyService.this;
        }
    }

    public void setA(boolean a) {

        this.a = a;
    }
}

今、あなたの活動では、あなたのサービスへのバインドとバインド解除を処理する必要があります。この例では、サービスはあなたが拘束されているかどうかに関係なく固執します。これが必要な機能でない場合は、次を呼び出すことはできませんstartService(...)

public class MyActivity extends Activity {

    //...
    private MyService myService;
    private boolean bound;

    @Override    
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        Intent intent = new Intent( this, MyService.class );
        startService( intent );
        doBindService();
    }

    private final ServiceConnection serviceConnection = new ServiceConnection() {

        public void onServiceConnected( ComponentName className, IBinder service ) {

            myService = ( (MyService.ServiceBinder) service ).getService();
            bound = true;
        }

        public void onServiceDisconnected( ComponentName className ) {

            myService = null;
            bound = false;
        }
    };

    void doBindService() {

        boolean bound = bindService( new Intent( this, MyService.class ), serviceConnection, Context.BIND_AUTO_CREATE );
        if ( bound ) {

            Log.d( TAG, "Successfully bound to service" );
        }
        else {

            Log.d( TAG, "Failed to bind service" );
        }
    }

    void doUnbindService() {

        unbindService( serviceConnection );
    }
}

これで、アクティビティにバインドされたサービスへの参照があり、呼び出しmyService.setA(true)てパラメーターを設定できます。

于 2013-02-05T15:36:32.303 に答える
1

簡単な使用

Intent intent1 = new Intent(this, MyService.class);
intent1.putExtra("key",value);
startService(intent1);

を使用してサービス中に取得します

 a = intent.getStringExtra("key");// or Int, ArrayList whatever
于 2013-02-05T15:40:09.807 に答える
1

start service を呼び出す代わりに、サービス オブジェクトにアクセスできるbindServiceを使用します。

これについての詳細なトピックはAndroid Docです

アクティビティがサービスにバインドされると、アクティビティからサービスの任意のメソッドを呼び出すことができます。次のようなことができます。

.... Activity Code
          mService.stopThread();


..... Service Code
         public void stopThread(){
             a = false;
         }

ここに私がそれを行う方法があります:

サービスに接続しようとしたときのアクティビティで:

    Intent serviceIntent = new Intent(this, MyService.class);
    bindService(serviceIntent, serviceConnection, BIND_AUTO_CREATE);

private ServiceConnection serviceConnection  = new ServiceConnection(){

    @Override
    public void onServiceConnected(ComponentName arg0, IBinder arg1) {
        mService = (MyService) ((MyService.LocalBinder) arg1)
                .getService();


    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        // TODO Auto-generated method stub
    }

};

そして私のサービスで:私はこのメンバーを追加します

private LocalBinder mBinder;


    protected void onCreate(Bundle bundle) {
               super.onCreate(bundle);
               mBinde = new LocalBinder();
         }

そしてこのクラス:

public class LocalBinder extends Binder {
    public MyService getService() {
        // Return this instance of LocalService so clients can call public
        // methods
        return MyService.this;
    }
}
于 2013-02-05T15:23:29.333 に答える
1

アクティビティとサービスの間のやり取りが単純であるため、サービスバインディングはあなたの場合にはやり過ぎだと思います。

提案されているように、を使用してパラメーターを渡すことができますstartService。別の解決策は、LocalBroadcast を使用することです。ここに例を示します

スレッドに関しては、匿名クラスではなく、サービス内の別のクラスとして定義する必要がある場合があります。次に例を示します。

class MyThread extends Thread{
   private boolean a = true;
   public void setA(boolean a){
      this.a = a;
   }
   public void run() {
        while(a)
        {
          ...
        }
    }

}
于 2013-02-05T16:12:58.350 に答える
0

私が質問を正しく理解した場合、これはあなたが必要とするものです:

アクティビティクラスで、startService()を呼び出す直前に、次の行を追加します。

intent1.putExtra("keyName","keyValue");

サービスでは、onStartCommand()で:

Bundle extras = intent.getExtras();
String param = extras.getString("keyName");

paramはパラメータを保持します。

于 2013-02-05T15:40:48.213 に答える