Проблема управления существующим сервисом из действия - PullRequest
0 голосов
/ 22 сентября 2011

Я новичок в Android. Я запускаю службу в Phone Boot Up. Я хотел бы управлять этим сервисом из активности, которую я запустил позже. Однако я не могу этого сделать.

Это потому, что я запускаю сервис из BroadCastReceiver и есть какая-то проблема с контекстом? Можете ли вы дать мне знать, что я делаю неправильно и как мне поступить? Буду признателен, если кто-нибудь сможет объяснить, как решить эту проблему.

Вот мои файлы:

MyPhoneBoot.java

package phone.Boot;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyPhoneBoot extends android.content.BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
    Log.d("MyPhoneBoot", "Phone Boot Captured");
    Intent expIntent=new Intent(context,MyService.class);
    context.startService(expIntent);
    }

}

MyService.Java

package phone.Boot;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

public static String TAG="MyNewService";
public static int service_running=999;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    service_running=2;
    Log.d(TAG, "onCreate");
    Log.d(TAG, "Value " + MyService.service_running);
}
@Override
public void onDestroy() {
    service_running=(-2);
    Log.d(TAG, "onDestroy");
    Log.d(TAG, "Value " + MyService.service_running);
}

@Override
public void onStart(Intent intent, int startid) {
    service_running=1;
    Log.d(TAG, "Value " + MyService.service_running);
    Log.d(TAG, "Service has been started!");
}
public void onStop(Intent intent, int startid) {
    service_running=(-1);
    Log.d(TAG, "Value " + MyService.service_running);
    Log.d(TAG, "Service has been stopped!");
}

}

MyActivity.Java

package phone.Boot;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MyActivity extends Activity implements OnClickListener{

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.d("MyActivity", "MyActivity running!" + MyService.service_running);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button myButton, myButton2;
    myButton = (Button) this.findViewById(R.id.button_1);
    myButton.setOnClickListener(this);
    myButton2 = (Button) this.findViewById(R.id.button_2);
    myButton2.setOnClickListener(this);

    /* changes done for binding service */
   }
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch(arg0.getId()){
        case R.id.button_1:
            switch (MyService.service_running)
            {
             case 2:
                Log.d("MyActivity", "Starting already created service!");
                Toast.makeText(this, "Alrdy created -> Starting now!", Toast.LENGTH_SHORT).show();
                startService(new Intent(this,MyService.class));
                break;

             case 1:
                Log.d("MyActivity", "Trying to start existing service!");
                Toast.makeText(this, "Alrdy Running!", Toast.LENGTH_LONG).show();
                break;

             case -2:
             case 999:
                Log.d("MyActivity", "Re-Starting Service");
                Toast.makeText(this, "Re-Starting Service!", Toast.LENGTH_SHORT).show();
                startService(new Intent(this,MyService.class));
                break;
            }

            break;
        case R.id.button_2:
            if(MyService.service_running == -1 || MyService.service_running == -2 || MyService.service_running == 999)
            {
                Log.d("MyActivity", "No Service To Stop!");
                Toast.makeText(this, "Nothing to Stop! x-(", Toast.LENGTH_LONG).show();
            }
            else if(MyService.service_running == 1 || MyService.service_running == 2)
            {
                Log.d("MyActivity", "Halting Service!!");
                Toast.makeText(this, "Stopping Service!", Toast.LENGTH_LONG).show();
                stopService(new Intent(this,MyService.class));
            }
            break;
        }

    }


}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="phone.Boot"
  android:versionCode="1"
  android:versionName="1.0">


<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name="MyPhoneBoot">
<intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED">
    </action>
</intent-filter>
</receiver>
<service android:enabled="true" android:name=".MyService" />
<activity android:name="phone.Boot.MyActivity"
          android:label="@string/app_name">
  <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
</manifest>

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Я тоже нуби, но я создал что-то похожее на тебя, и это прекрасно работает.Прежде всего, поскольку служба и действие являются частью одного и того же проекта, вы можете запускать и останавливать службу в порядке из действия.Запуск при загрузке не имеет значения (я остановился и нормально запускаю свои службы загрузки из-за своей активности).

Несколько вещей: что вы имеете в виду «это не работает»?Приложение вылетает?Какое значение вы получаете от service_running, когда пытаетесь получить к нему доступ из действия?

Кроме того, я не слишком уверен в жизненном цикле службы.Хотя вы явно не останавливаете его, он запускает код только один раз.Служба уже давно завершила свой код к тому времени, как вы завершили процесс загрузки и получили доступ к своей деятельности.Если вы не можете получить доступ к переменной service_running, я предполагаю, что служба мертва и она перестала существовать, хотя я могу ошибаться - я все-таки новичок: -)

Попробуйте создатьповторяющийся сервис (например, приемник GPS, который будет работать вечно), и посмотрите, поддерживает ли он его.

0 голосов
/ 22 сентября 2011

что именно вы хотите, не понятно.Вы хотите остановить службу или хотите снова запустить службу из действия, и вы не получаете желаемого результата.Эта запись может вам помочь.

...