AndroidアプリでViewを呼び出して表示後、そのViewを消す方法

このQ&Aのポイント
  • Androidアプリで定義したViewを呼び出して表示後、そのViewを消す方法を教えてください。
  • 画面Aの起動時に常駐する画面Zを、画面Aから画面Bに遷移した際に停止(削除)する方法を教えてください。
  • 常駐アプリを画面AのOnCreate()で起動させているが、画面BのOnPause()やOnStop()で停止させても画面Zが残ったままになります。どのようにすれば解決できますか?
回答を見る
  • ベストアンサー

Android アプリ

同アプリのソースファイルで定義したViewを呼び出して表示後、そのViewを消すということがしたいです。 詳細は 【画面A】が起動したときに常駐する【画面Z】を起動 → 【画面A】から【画面B】に遷移した際に常駐している【画面Z】を停止(削除) という動作を完成したいので 常駐アプリを【画面A】のOnCreate()で Intent intent = new Intent(getApplication(), OverlapService.class); // 常駐Serviceの開始 startService(intent); として起動させていて 画面BのOnPause()に Intent intent = new Intent(getApplication(), OverlapService.class); // 常駐Serviceの停止 stopService(intent); としていますが画面Zは残ったままになります。 画面BのOnStop()もコードを記述してみましたが上手くいきません。 どなたかお詳しい方、ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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】を閉じる処理も必要になります。

uki878
質問者

お礼

丁寧なご回答ありがとうございます。 > 対処として、まず どのタイミングで「stopService()」を呼びたいのか決める必要があります 【画面A】→【画面B】に遷移したときに【画面Z】常駐する画面)を削除したいです。 また【画面B】→【画面A】に戻った場合は再度【画面Z】(常駐する画面)を表示したいです。 【画面A】のOnResume()とOnPause()にstopserviceを実装してみたいと思います。

その他の回答 (5)

回答No.5

>回答No.4 amanojaku1 >【画面A】の「OnPause()」に「stopService()」を記述した場合、【画面A】以外の画面(【画面B】も含まれる)が表示されると【画面A】の「OnPause()」が呼ばれます(つまり他のアプリを起動した場合)。 >具体的には通知領域に登録されているアプリを起動した場合や、ホーム・ボタンを長押ししてタスク・マネージャーなどから他のアプリを起動した場合など。 あと(【画面A】が表示」されている場合)ホーム・ボタンを(普通に)押して【画面A】を消した場合にも【画面A】の「OnPause()」が呼ばれます。 この場合、【画面A】のアクティビティは まだ生きています(恐らくStop状態です)。

回答No.4

>しかし画面遷移の時にはなにも動作してくれませんでした。 >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()」あたりで良いかと思います。

回答No.3

>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); > }

uki878
質問者

お礼

Serviceの「onDestroy( )」内で「 windowManager.removeView(view);」を使いました。 アプリ自体を終了(タスクなどから)すると常駐していたViewは消えました。 しかし画面遷移の時にはなにも動作してくれませんでした。 stopserviceとはViewを消せないのでしょうか・・・

回答No.2

>回答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を指定する。

uki878
質問者

お礼

作成した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); で起動しております。

回答No.1

基本的にServiceに画面は存在しません(つまり説明が正確ではありません)。 Serviceは通知領域に登録したりしますが、通知領域のことでしょうか?

uki878
質問者

お礼

ご返事ありがとうございます。 Serviceとwindowmanagerを使用してそのviewが他画面でも常駐するようにしています。 その際【画面A】のOnCreate()でstartserviceしています。

関連するQ&A

  • Androidで画面遷移ができません.

    初心者ながら,Android向けにアプリを開発しています. ページXXXXXでボタンを表示させ,ページYYYYYで画像が表示されるようにしたいのですが,ページXXXXXで表示されたボタンを押すとエラーが出て強制終了となってしまいます. 画面遷移されるページ(YYYYY)には,適当な位置にタッチさせるとタッチした位置に移動する画像についてプログラミングしてあります.ページYYYYYは個別で実行すると正常に起動します. どこに原因があるのか教えてください.よろしくお願いします. ページXXXXXのソースは以下のとおりです. 【ソース】 import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.content.Intent; public class XXXXX extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent intent = new Intent(XXXXX.this, YYYYY.class); startActivity(intent); } }); } }

    • ベストアンサー
    • Java
  • androidのintentの使い方

    // //問題:LISTを押すと、エラーが出る、Intentの問題ですか? // public class FirstActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) private static final String TAG ="[HelloWorld]"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);// スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.firstlayout);// レイアウト設定ファイルの指定 ListView listview = (ListView) findViewById(R.id.fruitlist); // ListViewオブジェクト取得 listview.setOnItemClickListener(new ListItemClickListener()); // ListViewオブジェクトにクリックリスナーを関連付け } // アイテムクリックリスナー定義 class ListItemClickListener implements OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// onItemClickメソッド(値選択時イベントハンドラ) ListView listview = (ListView) parent; // ListViewオブジェクト取得 String item = (String) listview.getItemAtPosition(position);// 選択された値取得 Log.d(item, TAG); Intent intent = new Intent(FirstActivity.this,SecondActivity.class);// インテントの生成(呼び出すクラスの指定) startActivity(intent);// 次のアクティビティの起動 } } } -------------------------------------------------------------------------- public class SecondActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.main);// レイアウト設定ファイルの指定 } }

    • ベストアンサー
    • Java
  • androidの画面遷移について

    アンドロイドアプリケーションを開発しています。 アプリで以下のようにA画面から始まり3つのアクティビティを遷移するのですが A画面 → B画面 → C画面  ↑          ↓     ←  ←  ←  C画面からA画面に遷移させようとするとアプリケーションが止まってしまいます。 このとき画面は真っ黒またはA画面になり、タッチしても動作しません。 ログも停止します。 画面はすべてSurfaceViewで作っています。遷移はすべてIntentです。 Intentで同じ画面に戻るとき指定しなければ行けないことや、配慮しなければ いけないことがありましたら、教えてください。 ログも止まってしまうため、手がかりがない状態です。 これらのことが記載されているページや図書がありましたら教えていただけないでしょうか? 以上、よろしくお願いします。

  • androidアプリ開発について

    androidアプリ開発初心者です。 やりたいことは、 スタートボタンを押して、自分のお気に入りのページに飛び、(例えばオークションなど)サイトを表示させ、何分間ごとに更新できるループ処理?などができればいいなと考えています。 スタートボタンを押してサイトを表示するまでは何とか作れたのですが、それ以降をどのように作ったらいいのか分かりません。 初心者的な質問で申し訳ないのですが、どのように書いたらよいのか教えてください。 コードはこのようになっています。 <<main.xml>> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="192dp" android:layout_height="wrap_content" android:text="スタート" /> </LinearLayout> <<MainActivity.java>> import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { Button btn =null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Uri uri =Uri.parse("http://"); Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 長文で申し訳ありません。どうぞ宜しくお願い致します。

  • Android Serviceの戻り値

    Androidの開発を行っています。 サービスが「強制終了されて再起動した時」という条件で処理を行いたいです。 【START_REDELIVER_INTENT】を使用すればサービスが強制終了されて再起動したというのを感知できるのかなと思ったのですが・・・ http://yuki312.blogspot.jp/2012/07/androidserviceonstartcommand.html には 「システムはサービスを新たにインスタンス化し、サービスの再起動を行います。 再起動時のonStartCommandには、強制終了前と同じ内容のIntentが渡されます。 再起動順序は強制終了前の起動順序と同じです。(A⇒Bで起動した場合、A⇒Bで再起動) また、startServiceによりサービスを複数回起動していた場合は、起動した回数分 onStartCommandが呼ばれます。」 と説明されています。 サービスA、サービスBと2つのサービスが別クラスで定義されていても戻り値が【START_REDELIVER_INTENT】だと混同されてしまということでしょうか?

    • ベストアンサー
    • Java
  • Androidアプリ・SDKでの実行時エラー

    初めてアンドロイドアプリの開発をしています(多言語のプログラミング経験はありますが、JAVAは初めてです)。Eclipseで開発を行っていますが、ボタンをクリックしたら画面遷移をする、という処理を追加したところ、Android SDKで実行した際に 「アプリ名(パッケージ名)が予期せず停止しました。やり直してください。」 と出て、トップの画面も表示されなくなってしまいました。なお、Eclipse上ではエラーなどが出ていません。原因が解らず困っています。何かわかる方がいらっしゃいましたらお教え下さい。 以下がソースになります。 ■トップのActivity--------------------- package jp.xxxxx.xxxxx; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //ボタンを定義 Button btn1 = (Button) findViewById(R.id.btn1); //クリックイベント btn1.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent intent = new Intent( getApplicationContext() , SubActivity.class); startActivity(intent); } }); } } ■トップ画面のXML--------------------- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <ImageView android:id="@+id/topLogo" android:src="@drawable/logo" /> <LinearLayout android:id="@+id/linearLayout1"> <TextView android:id="@+id/btn1" android:text="@string/btn1text"></TextView> </LinearLayout> </LinearLayout> ■トップのAndroidManifest.xml--------------------- <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.xxxxx.xxxxx" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:label="@string/app_name" android:name="MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/screenName2" android:name="SubActivity"> </activity> </application> </manifest> なお、Activityの「//ボタンを定義」以下をコメントアウトした際には画面は出てきます。何か初歩的な間違いをしているかもしれませんが、どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • Activityクラスの取得方法

    AndroidStudioでBroadcastReceiverクラス内でActivityクラスを取得したいのですが、どうすれば取得できますでしょうか? BroadcastReceiverクラス内で Intent update_service = new Intent(context , UpdateService.class); startService(update_service);と入力するとstartServiceの部分が赤字になってしまうのですが private Activity activity;とし ....activity.startServiceなどとしても変数が灰色で困っています。 AndroidStudioでBroadcastReceiverクラス内でActivityクラスを取得したいのですが、どうすれば取得できるか教えてください。

    • ベストアンサー
    • Java
  • 無名クラスからのstartActivity

    androidの勉強をしております。 無名クラス内からIntentのコンストラクタに渡す引数がthisでは不十分なのはどうしてですか? 以下がソース例です。 略 public class HelloAndroid extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); 略 button1.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(HelloAndroid.this, HA2.class); startActivity(intent); } }); } }

    • ベストアンサー
    • Java
  • WEBから呼び出された場合、違うプログラムを実行

    教えて頂いた public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_g_main); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setClassName("com.google.android.apps.maps","com.google.android.maps.MapsActivity"); intent.setData(Uri.parse("https://maps.google.com/")); startActivity(intent); } でマップが起動できました。 再度お尋ねしますが、普通の起動の場合WEBVIEWを表示させて、そのWEBビュー内のサイトから呼び出された場合、上記のマップを表示する場合どうしたらいいでしょうか??

  • Androidプログラミング アプリが停止する

    eclipseでボタンを押すと画像が表示されるアプリをつくろうとしていましたがボタンをを押すとポップアップで「~を停止します。」と表示されアプリが落ちてしまいます。 Ver4.0を使用しています。 package my.application.imageviewer; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class ImageViewer extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void showImage(View view) { ImageView imageView1 = (ImageView)findViewById(R.id.imageView1); imageView1.setImageResource(R.drawable.sample); } } プログラムにミスがあるのでしょうか? 宜しくお願い致します。

専門家に質問してみよう