検索
連載

細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめAndroidで動く携帯Javaアプリ作成入門(58)(2/6 ページ)

Google I/O 2015で発表された次期版Android M。Google Now on tapで使うアシストAPIや、App Links、App Permissions、省電力のDoze/App Stanby、決済機能Android Payなどで使う指紋認証機能など新機能を分類して紹介。

Share
Tweet
LINE
Hatena

アプリのアクセス権限管理の細分化「App Permissions」

 これまでアプリがカメラやカレンダー、地理情報、マイク、通話機能、センサー、SMSなどにアクセスする権限に関する注意は、インストール/アップデート時にのみ表示されていましたが、これからはその権限を必要とする機能の初回実行時に許可を求められるようになります。ユーザーは、アプリごとに個別に機能ごとの権限を付与したり取り消したりすることができるようになります。


WhatsAppのアプリがマイクを使う例(Google I/O 2015基調講演の動画(YouTube)より引用)

 これにより、開発者はアプリが権限を与えられているかどうかを実行時にチェックすることが必要になりました。権限の許可を確認する場合はContext.checkSelfPermission()を、許可を要求する場合はActivity.requestPermission()を呼び出します。

 この変更による影響はパーミッションを使用する全てのアプリに影響します。パーミッションに関する詳細情報は『Permissions | Android Developers』を、アプリへの影響を評価する方法は『Testing Guide | Android Developers』のTesting Permissionsを参照してください。

システム全体の省電力「Doze」モード

 一定期間のスクリーンオフが続くと、システムはDoze(居眠り)モードに入ります。Dozeモードは以下のような制限があります。

  • 優先度の高いGCM(Google Cloud Messaging)を受信しない限り、ネットワークアクセスは無効
  • WakeLockは無視される
  • setAlarmClock()とAlarmManager.setAndAllowWhileIdle()以外のAlarmManagerによるアラームスケジュールは無効
  • Wi-Fiスキャンは実行されない
  • 同期アダプターとJobSchedulerによる同期とジョブの実行は許可されない

「Doze」モード中の同期イメージ(Google I/O 2015基調講演の動画(YouTube)より引用)

 デバイスがDozeモードから抜けると、保留されていた同期とジョブが実行されます。Android MでDozeモードを評価したい場合、以下のコマンドを実行することで可能です。

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
$ adb shell dumpsys deviceidle -h

アプリ単体の省電力「App standby」モード

 デバイスを操作していない状態であれば、「アプリはアイドル状態である」と判断できます。以下の状態ではない限り、アプリは一定期間後にアイドル状態になります。

  • ユーザーによってアプリが明示的に起動される
  • アプリがフォアグラウンドプロセスである
  • アプリがロック画面または通知トレイにNotificationを生成する
  • ユーザーが明示的に設定画面からアプリを「省電力の最適化」状態から除外する

 デバイスを充電していない場合、アプリはアイドル状態となります。ネットワークアクセスが無効になっている場合は、同期およびジョブが中断されます。充電中の場合は、アプリはネットワークアクセスが許可され、保留された全ての同期とジョブを実行できます。デバイスが長時間アイドル状態の場合、アイドル状態のアプリは1日1回、ネットワークアクセスが許可されます。

 Android MでApp standbyモードを評価したい場合は、以下のコマンドを実行することで可能です。

$ adb shell dumpsys battery unplug
$ adb shell am set-idle <packageName> true
$ adb shell am set-idle <packageName> false
$ adb shell am get-idle <packageName>

Direct Share(友人との共有が簡単に)

 Android Mでは、ユーザーが直感的かつ迅速に共有を行うためのAPIが追加されました。アプリのActivity内でダイレクトシェアするターゲットを定義できます。これらのダイレクトシェアターゲットは[共有]メニューでユーザーに公開されています。この機能により、ユーザーは連絡先などのターゲットに対しコンテンツをシェアできます。

 例えば、ダイレクトシェアターゲットは特定の友人やコミュニティにコンテンツをダイレクトシェアするため、他のSNSアプリのアクティビティなどを起動することがあります。


Direct Shareの実装例(「API OverviewのDirect Share」より引用)

 ダイレクトシェアターゲットを有効にするには、android.service.chooser.ChooserTargetServiceのサブクラスを定義しなければなりません。そしてマニフェストにChooserTargetServiceを宣言します。その宣言内でBIND_CHOOSER_TARGET_SERVICE権限とインテントフィルターSERVICE_INTERFACEを指定します。

 以下例は、ChooserTargetServiceをどのように宣言するかを示したマニフェストの一部です。

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

 公開するActivityごとに<meta-data>を定義して「"android.service.chooser.chooser_target_service"」の値にChooserTargetServiceを指定します。

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

実行エンジン「ART(Android RunTime)」の変更点

 Android 5.0で正式に導入された新しい実行エンジン「ART(Android RunTime)」ですが、Android Mでいくつか変更点があります。

 まず、適切なアクセスルールに基づくnewInstance()が実装されました。この変更により、以前のバージョンでDalvikが誤ったアクセスルールに基づいてチェックしていた問題が修正されます。

 アプリがnewInstance()を使用してアクセスチェックを無効にしたい場合、setAccessible()にtrueを渡して呼び出します。

 アプリがappcompatライブラリ(※)V7またはRecyclerViewライブラリV7を使用している場合、これらのライブラリを最新バージョンに置き換える必要があります。それ以外の場合は、対象のクラスのコンストラクターにアクセスできるようにXMLから参照するカスタムクラスが更新されていることを確認します。

※appcompatはAndroidでActionBarを表示するためのライブラリです。

 またAndroid Mでは、ダイナミックリンカーの動作を更新します。ダイナミックリンカーはライブラリのsonameとそのパスとの差異を理解し、sonameによる検索が実装されました。ロードされたときに不正なDT_NEEDEDエントリ(ビルドマシンのファイルシステムの場合は、通常絶対パス)を持っている場合、以前動作していたアプリが失敗することがあります。

 さらにAndroid Mでは、dlopen(3)のRTLD_LOCALフラグが正しく実装されました。dlopen(3)で明示的にRTLD_LOCALを除外していない場合、RTLD_LOCALはデフォルトであることに注意してください。RTLD_LOCALを使用すると、シンボルはdlopen(3)以降でロードされたライブラリが利用されることはありません。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る