1

現在の画面に関係なく、特定のイベントが発生したときに画面を開きたいのですが、どうすればよいですか?

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

上記のコードは、画面を開いてプログラムを開いている場合は機能しますが、画面がバックグラウンドにある場合は機能しません。それを機能させる方法は?ありがとうございました

4

3 に答える 3

1

インテントにFLAG_ACTIVITY_NEW_TASKを追加します。log cat を確認すると、このこともわかります。

于 2012-10-05T00:37:46.853 に答える
1

イベントが発生したときにアクティビティをロードするサービスを作成するだけです。

これを行うには、アプリケーションのロード時にサービスを開始し、サービス クラスにイベント レシーバーを設定します。このように、他のアプリケーションが実行中で、アプリケーションがフォアグラウンド (画面に表示されている) にない場合でも、イベントをトリガーすることができます。

Android のガベージ コレクションは、アクティビティがフォアグラウンドになく、リソースが不足し始めると、そのアクティビティを強制終了しようとします。

さらに一歩進んでサービスをフォアグラウンド サービスにしたい場合、理論的には、メモリが不足しているときに Android が強制終了するのはこれが最後になります。コード例が必要な場合はお知らせください。

うまくいけば、これはあなたを助けます!乾杯

- 編集 -

開始するためのコード例を次に示します。

アクティビティ onCreate で、上記と同様のコードを呼び出してサービスを起動します。すなわち:

    @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 に答える
0

これを試してみてください。以下のコードを使用してサービスを開始することもできます

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