6

我想知道服务是否从特定活动中终止,所以我在调用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). 我很幸运,我的情况不需要更复杂的事情。

4

3 回答 3

13

没有办法访问Intentin onDestroy。您必须以其他方式向服务发出信号(Binder、共享首选项、本地广播、全局数据或 Messenger)。这个答案中给出了一个使用广播的好例子。您也可以通过调用startService而不是stopService. startService如果一个新服务尚不存在,则仅启动一个新服务,因此多次调用startService是一种机制,您将Intents 发送到该服务。你看这个技巧被BroadcastReceivers. 由于您可以访问Intentin 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;
    }
于 2013-01-22T07:16:26.040 回答
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
    }
}
于 2013-01-25T15:59:46.817 回答
-1

全局状态

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

食谱:

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

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

这样做的方法是创建您自己的android.app.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

于 2013-01-23T04:15:56.210 回答