Android 通知バーにショートカット スイッチを追加する技術的実装

ここに画像の説明を挿入
通常、通知バーには「機内モード」「モバイルデータ通信」「画面録画」などの切り替えボタンが表示されますが、これらのボタンは通知バーのショートカットスイッチに属し、ショートカットスイッチをクリックすると特定のシステムを簡単に呼び出すことができます。機能を使用するか、アプリケーションの特定のページを開きます。通知バーのショートカットスイッチをカスタマイズすることはできますか? 答えは「はい」です。特に TileService ソリューションを使用します。

TileService は Service を継承するため、Android の 4 つの主要コンポーネントの 1 つでもありますが、これは特別なコンポーネントであり、開発者が手動で呼び出しを開く必要はなく、システムが自動的に呼び出しを識別して完了でき、システムは呼び出しをバインドします。サービス (bindService) メソッド呼び出し。

以下を使用して作成されました:

ショートカット スイッチは Android 7 (ターゲット 24) の新機能であるため、この機能を使用する前に、まずバージョン サイズ (ターゲット 24 以上) を決定する必要があります。
1. TileService クラスをカスタマイズします。

class MyQSTileService: TileService() {
    
    
  override fun onTileAdded() {
    
        
      super.onTileAdded()  
  }

  override fun onStartListening() {
    
        
      super.onStartListening()  
  }

  override fun onStopListening() {
    
        
      super.onStopListening()  
  }

  override fun onClick() {
    
        
      super.onClick()  
  }

  override fun onTileRemoved() {
    
        
      super.onTileRemoved()  
  }
}

TileService はバインディング サービス (bindService) によって呼び出されるため、バインドされたサービスのライフ サイクルに含まれる 4 つの代表的なコールバック メソッド (onCreate()、onBind()、onUnbind()、onDestroy()) が呼び出されます。ただし、TileService には次の特別なライフサイクル コールバック メソッドも含まれています。

onTileAdded(): ユーザーが編集バーから通知バーのクイック設定にショートカット スイッチを追加したときに呼び出されます。
onTileRemoved(): ユーザーが通知バーのクイック設定からショートカット スイッチを削除すると呼び出されます。
onClick(): ユーザーがショートカット スイッチをクリックすると呼び出されます。
onStartListening(): ユーザーが通知シェードのクイック設定を開いたときに呼び出されます。ショートカット スイッチが数式バーから設定バーにドラッグされていない場合は呼び出されません。TileAdded が追加された後に 1 回呼び出されます。
onStopListening(): ユーザーが通知シェードのクイック設定を開いたときに呼び出されます。ショートカット スイッチが数式バーから設定バーにドラッグされていない場合は呼び出されません。TileRemoved が削除される前に 1 回呼び出されます。

2. アプリケーションのマニフェスト ファイルで TileService を宣言します。

<service
     android:name=".MyQSTileService"
     android:label="@string/my_default_tile_label"  
     android:icon="@drawable/my_default_icon_label"
     android:exported="true"
     android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
     <intent-filter>
         <action android:name="android.service.quicksettings.action.QS_TILE" />
     </intent-filter>
 </service>

name: カスタム TileService のクラス名。
label: 通知バーに表示されるショートカット スイッチの名前。
icon: ショートカットスイッチの通知バーに表示されるアイコン。
exported: サービスを外部アプリケーションから呼び出すことができるかどうか。このプロパティは true でなければなりません。false の場合、ショートカット スイッチの機能は無効になります。その理由は、exported="false" の場合、TileService は外部アプリケーションの呼び出しをサポートせず、携帯電話システムは自然にショートカットと対話できなくなるためです。スイッチ。設定する必要があります。
権限: サービスに対して構成する必要がある権限。BIND_QUICK_SETTINGS_TILE により、アプリケーションがサードパーティのクイック設定にバインドできるようになります。設定する必要があります。
tent-filter: インテント フィルター。サービスは、内部アクションに一致する場合にのみ呼び出すことができます。設定する必要があります。

リスニング モード
TileService には 2 つのリスニング モード (または開始モード) があり、1 つはアクティブ モード、もう 1 つは標準モードです。
アクティブ モード
アクティブ モードでは、TileService が要求されるとサービスがバインドされ、TileService の onStartListening も呼び出されます。このモードは AndroidManifeast マニフェスト ファイルで宣言する必要があります。

<service ...>
    <meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
         android:value="true" />
    ...
</service>

TileService.requestListeningState() の静的メソッドを通じて、TileService へのリクエストを実現できます。

      TileService.requestListeningState(
            applicationContext, ComponentName(
                BuildConfig.APPLICATION_ID,
                MyQSTileService::class.java.name
            )
        )

アクティブ モードでは、ユーザーが通知バーのクイック設定でショートカット スイッチをクリックすると、TileService が自動的にバインドを完了し、TileService の onStartListening が呼び出されることに注意してください

TileService がクリックによってバインドされるか、requestListeningState リクエストによってバインドされるかに関係なく、TileService が配置されているプロセスが呼び出されます。

標準モード
標準モードでは、TileService が表示される (つまり、ユーザーが通知バーをプルダウンしてショートカット スイッチを表示する) と、サービスがバインドされ、TileService の onStartListening も呼び出されます。標準モードでは AndroidManifeast マニフェスト ファイルでの追加の宣言は必要なく、デフォルトは標準モードです。

標準モードでは、アクティブ モードと同じように、TileService がバインドされると、TileService が配置されているプロセスが呼び出されることに注意してください

アクティブ モードとは異なり、標準モードでの TileService のバインドは、ユーザーが通知バーをプルダウンすることによって実現されます。つまり、TileService が配置されているプロセスが複数回呼び出されます。したがって、メインプロセスが頻繁に呼び出されるのを防ぎ、DAU などのデータ統計への影響を避けるために、TileService に特定のサブプロセスを指定し、それを Androidmanifest マニフェスト ファイルに設定する必要もあります。

      <service
            ......
            android:process="自定义子进程的名称">
            ......
        </service>

ショートカット スイッチの更新 ショートカット
スイッチのデータを更新する必要がある場合は、getQsTile() を通じてショートカット スイッチのオブジェクトを取得し、setIcon (更新アイコン)、setLable (更新名)、setState (更新状態、 STATE_ACTIVE - オープンまたは有効な状態を意味します。 STATE_INACTIVE - クローズまたはサスペンド状態を示します。 STATE_UNAVAILABLE: 一時的に利用できない状態を示します。この状態では、ユーザーはタイルを操作できません) およびショートカット スイッチの新しいデータを設定するその他のメソッドが含まれます。 、最後に updateTile() メソッドを呼び出して を実現します。

  override fun onStartListening() {
    
    
    super.onStartListening()
    if (qsTile.state === Tile.STATE_ACTIVE) {
    
    
        qsTile.label = "inactive"
        qsTile.icon = Icon.createWithResource(context, R.drawable.inactive)
        qsTile.state = Tile.STATE_INACTIVE
    } else {
    
    
        qsTile.label = "active"
        qsTile.icon = Icon.createWithResource(context, R.drawable.active)
        qsTile.state = Tile.STATE_ACTIVE
    }
    qsTile.updateTile()
  }

操作ショートカットスイッチ

ショートカット スイッチをクリックしたときに通知バーを閉じて特定のページにジャンプしたい場合は、次のメソッドを呼び出すことができます。

startActivityAndCollapse(Intent intent)

ショートカット スイッチをクリックしたときに対話用のダイアログ ボックスをポップアップ表示したい場合は、次のメソッドを呼び出すことができます。

override fun onClick() {
    
    
    super.onClick()
    if(!isLocked()) {
    
    
        showDialog()
    }
 }

ユーザーが画面をロックするとショートカットスイッチが表示される場合があるため、isLocked()の判定を追加する必要があります。このダイアログは、画面がロックされていない場合にのみ表示されます。

ショートカット スイッチに機密情報が含まれている場合は、isSecure() を使用してデバイスのセキュリティを判断する必要があり、デバイスが安全である場合にのみ、ショートカット スイッチに関するロジック (クリックのロジックなど) を実行できます。デバイスが安全でない場合 (電話機がロック画面状態である場合)、unlockAndRun(Runnable runnable) を呼び出して、画面のロックを解除してカスタムの runnable 操作を実行するようにユーザーに求めることができます。

おすすめ

転載: blog.csdn.net/qq_24252589/article/details/131387835