1

我想在发生特定事件时打开一个屏幕,不管我现在在哪里,我该怎么做?

Intent Iatualizar = new Intent(this, Atualizar.class); 
startActivity(Iatualizar);

如果我在屏幕上打开程序,上面的代码有效,但在屏幕在后台时无效。如何让它发挥作用?谢谢你

4

3 回答 3

1

您应该只创建一个在事件发生时加载您的活动的服务。

为此,您可以在加载应用程序时启动服务,并将事件接收器放在服务类中。这样,即使其他应用程序正在运行并且您的应用程序不在前台(显示在屏幕上),您仍然可以触发事件。

如果您的活动不在前台并且您开始资源不足,Android 垃圾收集将尝试终止您的活动。

如果您想更进一步,使服务成为前台服务,那么理论上它将是 Android 在内存不足时将杀死的最后一件事。如果您需要代码示例,请告诉我。

希望这可以帮助你!干杯

- 编辑 -

这是一个帮助您入门的代码示例。

在您的活动中 onCreate 调用一些类似于您上面的代码来启动您的服务。IE:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
Intent IatualizarService = new Intent(this, AtualizarService.class); 
startService(Iatualizar);
}

如果你愿意,你也可以在你的 onResume 中包含它,(或者从一个按钮启动它,或者你希望这个服务启动)。

然后像这样创建一个服务类:

public class AtualizarService extends Service {
private final IBinder mBinder = new MyBinder();

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


    return START_STICKY;
  }

    @Override
    public void onCreate() {

// In here you can make your service a foreground service to help prevent garbage collection from occurring. 
 makeforeground();

}

    private boolean makeforeground() {
        String msg = "Turning on foreground service";
        ErrorLog.i(getApplicationContext(), TAG, msg);
        try {
            Notification notification = new Notification(
                    R.drawable.ic_dialog_info,
                    getText(R.string.notification_text),
                    System.currentTimeMillis());
            notification.flags |= Notification.FLAG_AUTO_CANCEL;

            Intent activityIntent = new Intent(this, YourMainActivity.class);
            activityIntent.setAction(Intent.ACTION_MAIN);
            activityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            activityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                    | Intent.FLAG_ACTIVITY_SINGLE_TOP);

            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    activityIntent, 0);
            notification.setLatestEventInfo(this,
                    getText(R.string.notification_title),
                    getText(R.string.notification_text), pendingIntent);
            startForeground(1234567890, notification); // random id
            return true;
        } catch (Exception e) {
            String error = "displayNotification Error Message: "
                    + e.getMessage() + " Cause: " + e.getCause();
            ErrorLog.e(GlobalParameters.getContext(),
                    TAG + " Notification Foreground Service", error);
            return false;
        }
    }

    @Override
    public void onDestroy() {
}

  @Override
  public IBinder onBind(Intent arg0) {
    return mBinder;
  }
    public class MyBinder extends Binder {
        AtualizarService getService() {
            return AtualizarService .this;
        }
    }
} 

然后在这个服务类中,你可以添加一个广播接收器,它可以触发你想要的任何事件。然后根据需要加载您的活动。

干杯

于 2012-10-05T01:08:25.893 回答
1

FLAG_ACTIVITY_NEW_TASK添加到您的 Intent 中。如果您检查日志猫,它也会告诉您这一点。

于 2012-10-05T00:37:46.853 回答
0

试试这个,你也可以使用下面的代码启动一个服务

Intent Iatualizar = new Intent(this, Atualizar.class); 
Iatualizar.addFlags(FLAG_ACTIVITY_NEW_TASK);
startActivity(Iatualizar);
于 2012-10-05T00:42:01.790 回答