- ベストアンサー
AndroidアプリでViewを呼び出して表示後、そのViewを消す方法
- Androidアプリで定義したViewを呼び出して表示後、そのViewを消す方法を教えてください。
- 画面Aの起動時に常駐する画面Zを、画面Aから画面Bに遷移した際に停止(削除)する方法を教えてください。
- 常駐アプリを画面AのOnCreate()で起動させているが、画面BのOnPause()やOnStop()で停止させても画面Zが残ったままになります。どのようにすれば解決できますか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>回答No.4 amanojaku1 >他のアプリに影響されたくない場合は、(【画面B】の「onStart()、onResume()」とかも考えられますが)とりあえず【画面B】の「onCreate()」あたりで良いかと思います。 この場合、【画面B】に遷移せずに【画面A】を終了した場合、【画面Z】は残ったままになります。 それに対応するためには、【画面A】の「onDestroy()」で「stopService()」を呼ぶ必要が在りますが、【画面B】に遷移して既に「stopService()」が呼ばれている場合も想定する必要があり、スイッチ的な変数(swServiceとか)を作って「stopService()」が2度呼ばれないようにする必要があります。 ただし、システムから【画面A】がキルされた場合は、【画面A】の「onDestroy()」が呼ばれない場合もあり、その場合は【画面Z】自体からボタンとかのクリックで【画面Z】を閉じる処理も必要になります。
その他の回答 (5)
- amanojaku1
- ベストアンサー率54% (265/488)
>回答No.4 amanojaku1 >【画面A】の「OnPause()」に「stopService()」を記述した場合、【画面A】以外の画面(【画面B】も含まれる)が表示されると【画面A】の「OnPause()」が呼ばれます(つまり他のアプリを起動した場合)。 >具体的には通知領域に登録されているアプリを起動した場合や、ホーム・ボタンを長押ししてタスク・マネージャーなどから他のアプリを起動した場合など。 あと(【画面A】が表示」されている場合)ホーム・ボタンを(普通に)押して【画面A】を消した場合にも【画面A】の「OnPause()」が呼ばれます。 この場合、【画面A】のアクティビティは まだ生きています(恐らくStop状態です)。
- amanojaku1
- ベストアンサー率54% (265/488)
>しかし画面遷移の時にはなにも動作してくれませんでした。 >stopserviceとはViewを消せないのでしょうか・・・ >画面BのOnPause()に >Intent intent = new Intent(getApplication(), OverlapService.class); >// 常駐Serviceの停止 >stopService(intent); >としていますが画面Zは残ったままになります。 【画面A】から【画面B】に遷移した際に【画面B】の「OnPause()」は呼ばれていません(つまり「stopService()」も呼ばれていません)。 詳細は下記「アクティビティのライフサイクル」を参照して下さい。 アクティビティのライフサイクル https://www.javadrive.jp/android/activity/index2.html 対処として、まず どのタイミングで「stopService()」を呼びたいのか決める必要があります。 【画面A】の「OnPause()」に「stopService()」を記述した場合、【画面A】以外の画面(【画面B】も含まれる)が表示されると【画面A】の「OnPause()」が呼ばれます(つまり他のアプリを起動した場合)。 具体的には通知領域に登録されているアプリを起動した場合や、ホーム・ボタンを長押ししてタスク・マネージャーなどから他のアプリを起動した場合など。 上記のように他のアプリに影響されたくない場合は、(【画面B】の「onStart()、onResume()」とかも考えられますが)とりあえず【画面B】の「onCreate()」あたりで良いかと思います。
- amanojaku1
- ベストアンサー率54% (265/488)
>Serviceとwindowmanagerを使用してそのviewが他画面でも常駐するようにしています。 >その際【画面A】のOnCreate()でstartserviceしています。 そうでしたか、申し訳ございませんでした。 下記ページではServiceの「onDestroy( )」内で「 windowManager.removeView(view);」を使ってます。 多分 この「view」は このサンプルの「windowManager.addView(view, params);」で表示されている画面だと思われます。 [Android] ServiceとWindowManagerを使って常駐アプリを作成 https://akira-watson.com/android/windowmanager.html > public void onDestroy() { > super.onDestroy(); > Log.d("debug","onDestroy"); > // Viewを削除 > windowManager.removeView(view); > }
お礼
Serviceの「onDestroy( )」内で「 windowManager.removeView(view);」を使いました。 アプリ自体を終了(タスクなどから)すると常駐していたViewは消えました。 しかし画面遷移の時にはなにも動作してくれませんでした。 stopserviceとはViewを消せないのでしょうか・・・
- amanojaku1
- ベストアンサー率54% (265/488)
>回答No.1 amanojaku1 もし、Service内で「notify( )」で通知領域に登録している場合は、Serviceの「onDestroy( )」で「cancel( )」すれば良いでしょう。 詳細は下記ページ参照。 【Android】 Notificationを実装する 【開発メモ】 http://blog.livedoor.jp/kojikoji1985/archives/51432816.html >nm.(nId, n); ↑Notification登録時(IDを指定しています)。 「nm」変数は あくまでも このページのサンプル用です。 >nm.cancel(nId); ↑Notificationキャンセル時にNotification登録時のIDを指定する。
お礼
作成したServiceのクラスの public int onStartCommand(Intent intent, int flags, int startId) で view = layoutInflater.inflate(R.layout.overlapservice, null); としてレイアウトファイルからInfalteするViewを作成して windowManager.addView(view, params); で Viewを画面上に追加して最後に return super.onStartCommand(intent, flags, startId); としています。 呼び出す側からは Intent intent = new Intent(getApplication(), OverlapService.class); // 常駐Serviceの開始 startService(intent); で起動しております。
- amanojaku1
- ベストアンサー率54% (265/488)
基本的にServiceに画面は存在しません(つまり説明が正確ではありません)。 Serviceは通知領域に登録したりしますが、通知領域のことでしょうか?
お礼
ご返事ありがとうございます。 Serviceとwindowmanagerを使用してそのviewが他画面でも常駐するようにしています。 その際【画面A】のOnCreate()でstartserviceしています。
お礼
丁寧なご回答ありがとうございます。 > 対処として、まず どのタイミングで「stopService()」を呼びたいのか決める必要があります 【画面A】→【画面B】に遷移したときに【画面Z】常駐する画面)を削除したいです。 また【画面B】→【画面A】に戻った場合は再度【画面Z】(常駐する画面)を表示したいです。 【画面A】のOnResume()とOnPause()にstopserviceを実装してみたいと思います。