如何将参数从活动传递到服务...当用户停止服务时

时间:2011-01-10 22:01:30

标签: android parameters service android-activity ondestroy

我有一个带有复选框的活动:如果未选中chekbox,则停止该服务。这是我的活动代码的片段:

    Intent serviceIntent = new Intent();
    serviceIntent.setAction("com.android.savebattery.SaveBatteryService");

    if (*unchecked*){
        serviceIntent.putExtra("user_stop", true);
        stopService(serviceIntent);

当我停止服务时,我传递参数“user_stop”来说明用户停止它而不是系统的服务(低内存)。

现在我必须在我的服务的void onDestroy中读取变量“user_stop”:

public void onDestroy() {
super.onDestroy();

Intent recievedIntent = getIntent(); 
boolean userStop= recievedIntent.getBooleanExtra("user_stop");

    if (userStop) {
       *** notification code ****

但它不起作用!我不能在onDestroy中使用getIntent()!

任何建议?

感谢

西蒙

4 个答案:

答案 0 :(得分:6)

我看到两种方法:

  1. 使用共享首选项。
  2. 使用本地广播。

  3. 第一种方法是简单直接的方法。但它不是很灵活。基本上你做:

    • 一个。将“用户停止”共享首选项设置为true。
    • 湾停止服务
    • ℃。在onDestroy服务中,检查“用户停止”首选项的值是什么。

    另一种方法是更好的方法,但需要更多代码。

    • 一个。在服务类中定义字符串常量:
       
    final public static string USER_STOP_SERVICE_REQUEST = "USER_STOP_SERVICE".
    • 湾创建一个内部类BroadcastReceiver类:

      public class UserStopServiceReceiver extends BroadcastReceiver  
      {  
          @Override  
          public void onReceive(Context context, Intent intent)  
          {  
              //code that handles user specific way of stopping service   
          }  
      }
      
    • ℃。在onCreate或onStart方法中注册此接收器:

      registerReceiver(new UserStopServiceReceiver(),  newIntentFilter(USER_STOP_SERVICE_REQUEST));
    • d。从您想要停止服务的任何地方:

      context.sendBroadcast(new Intent(USER_STOP_SERVICE_REQUEST));

    请注意,您可以使用此方法通过Intent传递任何自定义参数。

答案 1 :(得分:1)

我不认为依赖onDestroy()是一件好事。您可以采取几种方法。

  1. 建议绑定服务,以便您可以在onUnbind http://developer.android.com/guide/topics/fundamentals.html#servlife

  2. 中编写用户通知
  3. 其他选项(不确定这是否有效)是将您的变量发布到SharedPreferences并从onDestroy()获取它。 [您需要检查它是否在调试模式或LogCat消息中工作。

答案 2 :(得分:-1)

我在我的应用程序中使用CheckBoxPreference和服务类的onCreate中的getSharedPreference具有相同的设置。选中该复选框即可启动该服务。取消选中会停止服务。

在我的活动中收听并处理首选项:

    getPreferenceManager().findPreference("prefEnable").setOnPreferenceClickListener(new OnPreferenceClickListener()
    {
        // not used: Intent intent = new Intent(this, MyService.class);
        @Override
        public boolean onPreferenceClick(Preference preference) {
            CheckBoxPreference cb = (CheckBoxPreference) preference;
            if (cb.isChecked()) {
                Log.d(TAG, "User enabled service");
                // code to start service
            } else {
                Log.d(TAG, "User disabled service");
                // code to stop service
            }
            return true;
        }
    });

在我的服务onCreate中获取我的“prefEnable”首选项:

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean isEnabled = preferences.getBoolean("prefEnable", false);

也许在你的onDestroy中,你可以重新使用它并说:

if (isEnabled==false) {
   *** notification code ***

答案 3 :(得分:-1)

//您可以用这种简单的方式传递参数: -

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
   serviceIntent.putExtra("From", "Main");
   startService(serviceIntent);
//and get the parameter in onStart method of your service class

    @Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
     Bundle extras = intent.getExtras(); 
if(extras == null)
    Log.d("Service","null");
else
{
    Log.d("Service","not null");
    String from = (String) extras.get("From");
    if(from.equalsIgnoreCase("Main"))
        StartListenLocation();
}

}
Enjoy :)