質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

4260閲覧

Androidでserviceが自動再起動してしまう

zpberry

総合スコア8

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/08/05 07:26

activityからstartService()で呼び出した常駐サービスが、activityを(アプリ一覧画面からスワイプして)消すと同時に再起動してしまいます。Bindは使っていません。
最小限のソースで試してみましたが同じ現象が起きてしまいます。

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button start_button = (Button)findViewById(R.id.start_button); Button stop_button = (Button)findViewById(R.id.stop_button); final Intent firstIntent = new Intent(getApplication(),Experiment.class); start_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(firstIntent); } }); stop_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(firstIntent); } }); } }
public class Experiment extends Service { NotificationManagerCompat manager; @Override public void onCreate() { super.onCreate(); Log.d("SERVICE", "onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("SERVICE", "onStartCommand"); NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()); builder.setSmallIcon(R.drawable.icon); builder.setContentTitle("TEST"); Notification notification = builder.build(); manager = NotificationManagerCompat.from(getApplicationContext()); manager.notify(0,notification); //return super.onStartCommand(intent, flags, startId); return START_NOT_STICKY; //強制終了後の再起動を防ぐ } @Override public void onDestroy() { Log.d("SERVICE", "onDestroy"); manager.cancel(0); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } }

ログ

D/SERVICE: onCreate D/SERVICE: onStartCommand

上記のソースを実行すると、activityを消した後serviceは通知を消去されませんでした。また、その後serviceが自動で起動することはありませんでした(「設定」アプリから確認)。
・ログに"onDestroy"が出力されていない
・通知が消されていない
・その後自動再起動していない(強制終了のためSTART_NOT_STICKYが効いた?)
の三点から、システムか何かに定義したonDestroyを通さず、強制終了されていると思われます。
この強制終了の原因、そして対策方法の御教授お願いします。

android実機version:5.1.1
開発API:22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

startServiceに渡しているContextがApplicationになっているからかもしれません。ActivityのContextを渡してみてください。

投稿2016/08/05 13:33

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zpberry

2016/08/06 07:09 編集

回答ありがとうございます。MainActivity.thisを渡してみたのですが同じ挙動をしてしまいます。contextはあまり深く知らずに使っていたのでこれを機に調べてみようと思います。
yona

2016/08/06 09:43

アプリ一覧から削除しているからかもしれないですね。 一度finishを読んで確認してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問