将数据传递给服务的onDestroy()

时间:2013-01-16 06:05:27

标签: android android-intent service

我想知道该服务是否已从特定活动中终止,因此我在调用stopServivce(service)时从该活动传递字符串。

以下是代码:

Intent service = new Intent(Activity.this,
                        service.class);
                service.putExtra("terminate", "activity terminated service");
                stopService(service);

但我似乎可以在getIntent().getExtras().getString("terminate);方法中使用onDestroy()访问此变量。

[编辑]

我找到了绕过这个障碍的方法,但我仍然希望我的问题得到解答。我只是在活动中的onDestroy()方法中做了我必须做的事情,然后调用了stopService(service)。我很幸运,我的情况并不需要更复杂的事情。

3 个答案:

答案 0 :(得分:12)

无法访问Intent中的onDestroy。您必须以其他方式发出信号(Binder,共享首选项,本地广播,全局数据或Messenger)。在this answer中给出了使用广播的一个很好的例子。您也可以致电startService而不是stopService来解决此问题。 startService仅在尚未存在的情况下启动新服务,因此对startService的多次调用是向服务发送Intent的机制。你看到BroadcastReceivers使用了这个技巧。由于您可以访问Intent中的onStartCommand,因此您可以通过检查Intent个附加内容并在指示终止时调用stopSelf来实现终止。这是一个实际的草图 -

public int onStartCommand(Intent intent, int flags, int startId) {
        final String terminate = intent.getStringExtra("terminate");

        if(terminate != null) {
            // ... do shutdown stuff
            stopSelf();
        }
        return START_STICKY;
    }

答案 1 :(得分:0)

只是为了说明iagreen的建议;

活动

Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.yourfilter");
broadcastIntent.putExtra("activity_name", "your_activity");

sendBroadcast(broadcastIntent);

在服务中

 private YourActionReceiver abc;

    this.abc = new YourActionReceiver();

    registerReceiver(this.abc, new IntentFilter("com.package.yourfilter"));

    public class YourActionReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
    // Get the name of activity that sent this message
    }
}

答案 2 :(得分:-1)

全球州

是你的朋友。 :)
在需要时检查全局字符串(比如在终止之前)。您可能还希望拥有枚举state一个标志,以查看状态是否有效。

配方:

您遇到的更普遍的问题是如何跨多个活动和应用程序的所有部分保存状态。静态变量(例如,单例)是实现此目的的常见Java方法。然而,我发现Android中更优雅的方式是将您的状态与应用程序上下文相关联。

如您所知,每个Activity也是一个Context,它是有关其最广泛意义上的执行环境的信息。您的应用程序还有一个上下文,Android保证它将作为整个应用程序中的单个实例存在。

执行此操作的方法是创建自己的android.app.Application子类,然后在清单中的application标记中指定该类。现在,Android将自动创建该类的实例,并使其可用于整个应用程序。您可以使用Context.getApplicationContext()方法从任何上下文访问它(Activity还提供了一个方法getApplication(),它具有完全相同的效果):

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

class BlahBlah extends Service {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

这与使用静态变量或单例具有基本相同的效果,但与现有的Android框架完全集成。请注意,这不适用于整个流程(如果您的应用程序是少数具有多个流程的应用程序之一)。

积分转到@Soonil