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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Q&A

解決済

1回答

3673閲覧

AndroidStudioでの通知チャンネルについて

tanaka_hana

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/11/08 15:41

編集2018/11/10 06:26

疑問

Androidアプリ開発の教科書(翔泳社)の第13章の「バックグラウンド処理と通知機能」というところで、通知機能のサンプルコードとその解説に疑問を持ちました。

通知を扱うにはチャンネルを生成する。そして、その後に通知を出すためにビルダーとマネージャーを使う。
という感じの流れだったのですが、そもそもチャンネルを生成する理由が分かりません。。チャンネル生成のコード部分を書かなくても通知はビルダーとマネージャーで生成できているみたいですし、エミュレータ側でも全く違いが分かりませんでした。
また、結局通知チャンネルを調べてもよく理解することができませんでした。。

質問をまとめると、

  1. なぜ通知チャンネルを作らなくてはいけないのでしょうか?
  2. 通知チャンネルとはユーザが設定するもので、プログラマが書く必要があるのでしょうか?
  3. 通知チャンネルとは結局なんなのでしょうか?

Androidはまだ初めてばかりで見慣れないことも多いのですが、どうかよろしくお願いします。
コメントアウトしている部分が該当箇所で、参考書「Androidアプリ開発の教科書」のサンプルコードとそのURLを載せておきます。ただし、imort文は省略しています。

URL:http://www.wings.msn.to/index.php/-/A-03/978-7981-5202-8/
の中のServiceSampleというフォルダです。

該当のソースコード(SoundManagerService.java)

java

1public class SoundManageService extends Service { 2 3 private MediaPlayer _player; 4 5 @Override 6 public void onCreate(){ 7 8 _player=new MediaPlayer(); 9 //通知チャンネルの作成 10 String id="soundmanagerservice_notification_channel"; 11 String name=getString(R.string.notification_channel_name); 12 int importance=NotificationManager.IMPORTANCE_HIGH; 13 NotificationChannel channel=new NotificationChannel(id,name,importance); 14 channel.enableVibration(true); 15 NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 16 manager.createNotificationChannel(channel); 17 } 18 19 @Override 20 public int onStartCommand(Intent intent,int flags,int startId){ 21 String mediaFileUriStr="android.resource://"+getPackageName()+"/"+R.raw.creek; 22 Uri mediaFileUri=Uri.parse(mediaFileUriStr); 23 24 try{ 25 _player.setDataSource(SoundManageService.this,mediaFileUri); 26 _player.setOnPreparedListener(new PlayerPreparedListener()); 27 _player.setOnCompletionListener(new PlayerCompletionListener()); 28 _player.prepareAsync(); 29 30 }catch (IOException e){ 31 e.printStackTrace(); 32 } 33 return START_NOT_STICKY; 34 } 35 36 @Override 37 public void onDestroy(){ 38 if (_player.isPlaying()){ 39 _player.stop(); 40 } 41 42 _player.release(); 43 _player=null; 44 } 45 46 @Override 47 public IBinder onBind(Intent intent) { 48 // TODO: Return the communication channel to the service. 49 throw new UnsupportedOperationException("Not yet implemented"); 50 } 51 52 private class PlayerPreparedListener implements MediaPlayer.OnPreparedListener{ 53 54 @Override 55 public void onPrepared(MediaPlayer mp){ 56 mp.start(); 57 } 58 } 59 60 private class PlayerCompletionListener implements MediaPlayer.OnCompletionListener{ 61 62 @Override 63 public void onCompletion(MediaPlayer mp){ 64 //ビルダーとマネージャーを使い通知を出す 65 NotificationCompat.Builder builder=new NotificationCompat.Builder(SoundManageService.this,"soundmanagerservice_notification_channel"); 66 builder.setSmallIcon(android.R.drawable.ic_dialog_info); 67 builder.setContentTitle(getString(R.string.msg_notification_title_finish)); 68 builder.setContentText(getString(R.string.msg_notification_text_finish)); 69 Notification notification=builder.build(); 70 NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 71 manager.notify(0,notification); 72 73 stopSelf(); 74 } 75 } 76} 77 78

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

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

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

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

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

guest

回答1

0

ベストアンサー

1. なぜ通知チャンネルを作らなくてはいけないのでしょうか?

A. 通知が表示できないからです。

Android 8.0 (API 26)で「通知チャンネル(Notification Channel)」という概念が追加され、通知を表示するには、通知に通知チャンネルを設定しなければならなくなりました。

なお、Android 8.0以前では通知チャンネルがないため、通知チャンネルを設定しなくても通知を表示できます。(「設定しなくても」というより、通知チャンネルが存在しないので、そもそも設定できません。)

2. 通知チャンネルとはユーザが設定するもので、プログラマが書く必要があるのでしょうか?

通知チャンネルとはユーザが設定するもので

A. その理解は誤りです。

プログラマが書く必要があるのでしょうか?

A. 書く必要があります。

通知チャンネルごとの通知の表示設定はユーザーが行いますが、通知チャンネルの設定(チャンネルID・表示名・初期重要度など)は、プログラマがJavaコード上に記述します。

3. 通知チャンネルとは結局なんなのでしょうか?

A. 通知のカテゴリです。

出典:Galapagos Blog - 【Android】Notification Channelのお話

アプリによって通知チャンネルが作成されると、設定アプリのアプリ通知設定に表示されるようになります。上記の画像は、「お知らせ」「重要」通知チャンネルが作成された場合です。

通知チャンネルの作成により、ユーザーは通知チャンネルごとに通知を表示する・しないを選択できるようになります。

単に通知を表示するだけであれば、アプリで通知チャンネルを1つ作成し、それを全ての通知で使いまわしても問題はありません。しかし、ユーザーの利便性を考えると、通知の種類ごとに適切な通知チャンネルを作成した方が良いです。

補足

参考:Android Developers - Create and Manage Notification Channels
アプリ通知設定画像 出典:Galapagos Blog - 【Android】Notification Channelのお話

投稿2018/11/12 10:53

編集2018/11/12 11:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tanaka_hana

2018/11/12 15:25

返信ありがとうございます。プログラマの通知チャンネルをユーザの通知チャンネル表示設定と混同していました。エミュレータ側では、貼っていただいた画像の各通知チャンネルから詳細にとべて、そこから重要性や音声の種類までいじれるので勘違いしました。 ただ、Nexus5X API26をエミュレータとして使用しているのですが、該当のソースコードのonCreate()の中のコメントアウト以下を消して実行しても、何も変わらずに通知が表示されます。。
bobmax

2018/11/19 06:51 編集

横から失礼します。 状況が分からないので憶測ですが、onCreate()内を削除前のアプリをアンインストールせずに実行していませんか? 一度createNotificationChannel()で作成した通知チャンネルはアプリをアンインストールしないと作られたままです。ですのでonCreate()内を削除前に作成された通知チャンネルが残っていて、そのチャンネルで通知を表示しているのだと思います。
tanaka_hana

2018/11/24 09:23

返信おそくなりすみません。試してみたところ大丈夫でした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問