現在の画面に関係なく、特定のイベントが発生したときに画面を開きたいのですが、どうすればよいですか?
Intent Iatualizar = new Intent(this, Atualizar.class);
startActivity(Iatualizar);
上記のコードは、画面を開いてプログラムを開いている場合は機能しますが、画面がバックグラウンドにある場合は機能しません。それを機能させる方法は?ありがとうございました
現在の画面に関係なく、特定のイベントが発生したときに画面を開きたいのですが、どうすればよいですか?
Intent Iatualizar = new Intent(this, Atualizar.class);
startActivity(Iatualizar);
上記のコードは、画面を開いてプログラムを開いている場合は機能しますが、画面がバックグラウンドにある場合は機能しません。それを機能させる方法は?ありがとうございました
インテントにFLAG_ACTIVITY_NEW_TASKを追加します。log cat を確認すると、このこともわかります。
イベントが発生したときにアクティビティをロードするサービスを作成するだけです。
これを行うには、アプリケーションのロード時にサービスを開始し、サービス クラスにイベント レシーバーを設定します。このように、他のアプリケーションが実行中で、アプリケーションがフォアグラウンド (画面に表示されている) にない場合でも、イベントをトリガーすることができます。
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;
}
}
}
次に、このサービス クラス内に、任意のイベントでトリガーできるブロードキャスト レシーバーを追加できます。そして、必要に応じてアクティビティをロードします。
乾杯
これを試してみてください。以下のコードを使用してサービスを開始することもできます
Intent Iatualizar = new Intent(this, Atualizar.class);
Iatualizar.addFlags(FLAG_ACTIVITY_NEW_TASK);
startActivity(Iatualizar);