SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android Studio 2で始めるアプリ開発入門

Androidアプリでのバックグラウンド処理と通知機能

Android Studio 2で始めるアプリ開発入門 第13回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ノーティフィケーションからのアクティビティ起動

 最後に、通知ドロワーからアクティビティを起動するように改造しましょう。

 現状、再生ボタンを押した後、つまりメディアの再生がバックグラウンドで開始された後にアクティビティを終了させてしまうと、メディア再生の停止、つまり、サービスの停止が行えません。そこで、サービス開始と同時に通知を表示し、通知ドロワーをタップすると、再度アクティビティが起動するように改造します。

 PlayerPreparedListenerのonPrepared()メソッドに以下の内容を追記してください。

リスト8 onPrepared()メソッドに処理を追加
public void onPrepared(MediaPlayer mp) {
    mp.start();  // (1)

    NotificationCompat.Builder builder = new NotificationCompat.Builder(SoundManageService.this);  // (2)
    builder.setSmallIcon(android.R.drawable.ic_dialog_info);  // (2)
    builder.setContentTitle("再生開始");  // (2)
    builder.setContentText("音声ファイルの再生を開始しました");  // (2)

    Intent intent = new Intent(SoundManageService.this, SoundStartActivity.class);  // (3)
    intent.putExtra("fromNotification", true);  // (3)
    PendingIntent stopServiceIntent = PendingIntent.getActivity(SoundManageService.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);  // (4)
    builder.setContentIntent(stopServiceIntent);  // (5)
    builder.setAutoCancel(true);  // (6)

    Notification notification = builder.build();  // (7)
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  // (7)
    manager.notify(1, notification);  // (7)
}

 (1)はもともと記述されていたものです。

 (2)と(7)はonCompletion()に記述したリスト7とほぼ同じです。違うのは、表示文面とnorify()の第1引数だけです。

 (3)~(6)が新たに追加された処理です。通知ドロワーをタップしてアクティビティを起動させるには、(5)のように、BuilderのsetContentIntent()メソッドを使います。

 引数としてはPendingIntentオブジェクトを渡します。PendingIntentというのは指定されたタイミングで使用されるインテントと理解して問題ありません。PendingIntentオブジェクトでActivityの起動をつかさどるものを生成するには、PendingIntentクラスのstaticメソッドであるgetActivity()を利用します。

 引数は4個あり、第1引数はコンテキストです。

 第2引数は、複数の画面部品からこのPendingIntentを利用する際に、それらを区別するための数字です。今回は複数部品からの利用はありませんので、0にしています。

 第3引数が起動先Activityクラスを指定した通常のIntentオブジェクトです。このオブジェクトを生成している処理が(3)です。今回は、さらにputExtra()でデータの引き継ぎを行っています。このデータの利用法は後述します。

 第4引数は、すでにOS内に同じ種類のPendingIntentオブジェクトが残っている場合にどのような処理をするかの設定です。これはPendingIntentクラスの定数で指定し、今回は、FLAG_CANCEL_CURRENTを指定しています。これは、残っているオブジェクトを破棄し、新しいのと置き換える処理を指定しています。ノーティフィケーションでPendingIntentを使用する場合は、この定数を指定したほうがいいでしょう。

 これら、(3)~(5)の処理で、通知ドロワーをタップすることで、SoundStartActivity画面が再表示されます。その際、タップされた通知メッセージを自動的に消去するように設定しているのが(6)です。

 最後に、通知メッセージ経由でSoundStartActivity画面が表示された場合、再生ボタンを使用不可して停止ボタンが使用可能になるように、SoundStartActivityのonCreate()メソッドに以下のコードを追記してください。

リスト9 SoundStartActivityのonCreate()メソッドに処理を追加
protected void onCreate(Bundle savedInstanceState) {
        ~省略~
    Intent intent = getIntent();
    boolean fromNotification = intent.getBooleanExtra("fromNotification", false);  // (1)
    if(fromNotification) {
        Button btPlay = (Button) findViewById(R.id.btPlay);
        Button btStop = (Button) findViewById(R.id.btStop);
        btPlay.setEnabled(false);
        btStop.setEnabled(true);
    }
}

 特に説明の必要はないでしょうが、ノーティフィケーションからの経由か通常の起動かを分岐するために、Intentオブジェクトから引き継ぎデータを取得しているのが(1)です。このために、リスト8の(3)でputExtra()を行っています。

 これで、コーディングは終了です。アプリを再起動し、再生を行ってください。通知が表示されていることが確認できるでしょう。その上で、再生中にアクティビティを終了し、通知ドロワーからメッセージをタップしてください。再度アクティビティが起動し、停止ボタンが機能することが確認できるでしょう。

まとめ

 今回は、サービスとノーティフィケーションを解説しました。次回はマップアプリなどOSがもともと用意しているアプリとの連携を扱います。同時に、GPS機能の利用法も扱います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Android Studio 2で始めるアプリ開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook<個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9817 2018/05/23 15:37

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング