A implementação técnica de adicionar opções de atalho à barra de notificação do Android

insira a descrição da imagem aqui
Normalmente, podemos ver botões de alternância como "modo avião", "dados móveis" e "gravação de tela" na barra de notificação. Esses botões pertencem aos interruptores de atalho na barra de notificação. Clicar no interruptor de atalho pode facilmente chamar um determinado sistema capacidade ou abrir uma página específica de um aplicativo. É possível personalizar um botão de atalho na barra de notificação? A resposta é sim, especificamente através da solução TileService.

TileService herda do Service, então também é um dos quatro principais componentes do Android, mas é um componente especial, os desenvolvedores não precisam abrir manualmente a chamada, o sistema pode identificar e concluir a chamada automaticamente, o sistema vinculará o chamada de método de serviço (bindService).

Criado usando:

A chave de atalho é um novo recurso do Android 7 (alvo 24), portanto, antes de usar esse recurso, você deve primeiro determinar o tamanho da versão (maior ou igual ao destino 24).
1. Personalize uma classe 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 é chamado pelo serviço de ligação (bindService), portanto, os quatro métodos típicos de retorno de chamada (onCreate(), onBind(), onUnbind() e onDestroy()) incluídos no ciclo de vida do serviço vinculado serão chamados. No entanto, TileService também inclui os seguintes métodos especiais de retorno de chamada do ciclo de vida:

onTileAdded(): Será chamado quando o usuário adicionar um botão de atalho da barra de edição para a configuração rápida da barra de notificação.
onTileRemoved(): Chamado quando o usuário remove o botão de atalho das configurações rápidas na barra de notificação.
onClick(): Chamado quando o usuário clica no botão de atalho.
onStartListening(): Chamado quando o usuário abre as configurações rápidas da aba de notificações. Ele não será chamado quando o botão de atalho não for arrastado da barra de fórmulas para a barra de configurações. Chamado uma vez depois que TileAdded é adicionado.
onStopListening(): Chamado quando o usuário abre as configurações rápidas da aba de notificações. Ele não será chamado quando o botão de atalho não for arrastado da barra de fórmulas para a barra de configurações. Chamado uma vez antes de TileRemoved ser removido.

2. Declare TileService no arquivo de manifesto do aplicativo.

<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: O nome da classe do TileService personalizado.
label: O nome do botão de atalho exibido na barra de notificação.
ícone: O ícone exibido na barra de notificação para o botão de atalho.
exportado: se o serviço pode ser chamado por aplicativos externos. Esta propriedade deve ser verdadeira. Se for false, a função do switch de atalho será inválida. O motivo é que, quando exported="false", o TileService não suportará chamadas de aplicativos externos e o sistema de telefonia móvel naturalmente não poderá mais interagir com o atalho trocar. Deve ser configurado.
permissão: A permissão que precisa ser configurada para o serviço, BIND_QUICK_SETTINGS_TILE permite que o aplicativo se vincule às configurações rápidas de terceiros. Deve ser configurado.
intent-filter: Filtro de intenção, o serviço só pode ser invocado se corresponder à ação interna. Deve ser configurado.

Modo de escuta
Existem dois modos de escuta (ou modo inicial) do TileService, um é o modo ativo e o outro é o modo padrão.
Modo ativo
No modo ativo, quando TileService é solicitado, o serviço será vinculado e onStartListening de TileService também será chamado. Este modo precisa ser declarado no arquivo de manifesto AndroidManifest:

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

Através do método estático de TileService.requestListeningState(), a requisição ao TileService pode ser realizada. O exemplo é o seguinte:

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

No modo ativo, vale a pena notar que,
quando o usuário clicar no botão de atalho na configuração rápida da barra de notificação, o TileService concluirá automaticamente a ligação e o onStartListening do TileService será chamado.
Se TileService for vinculado por clique ou por solicitação requestListeningState, o processo em que TileService está localizado será chamado.

Modo padrão
No modo padrão, quando o TileService estiver visível (ou seja, o usuário abaixa a barra de notificação para ver o botão de atalho), o serviço será vinculado e o onStartListening do TileService também será chamado. O modo padrão não requer declarações adicionais no arquivo de manifesto AndroidManifest e o padrão é o modo padrão.

Vale ressaltar que no modo padrão:
igual ao modo ativo, quando o TileService for vinculado, será chamado o processo onde o TileService está localizado.
Diferente do modo ativo, a ligação do TileService no modo padrão é realizada pelo usuário puxando a barra de notificação para baixo, o que significa que o processo onde o TileService está localizado será invocado várias vezes. Portanto, para evitar que o processo principal seja invocado com frequência e para evitar que estatísticas de dados, como DAU, sejam afetadas, também precisamos especificar um subprocesso específico para TileService e defini-lo no arquivo de manifesto Androidmanifest:

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

Atualize a chave de atalho
Se precisar atualizar os dados da chave de atalho, você pode obter o objeto da chave de atalho por meio de getQsTile() e, em seguida, usar setIcon (ícone de atualização), setLable (nome de atualização), setState (estado de atualização, incluindo STATE_ACTIVE - significa estado aberto ou ativado, STATE_INACTIVE - indica o estado fechado ou suspenso, STATE_UNAVAILABLE: indica o estado temporariamente indisponível, neste estado, o usuário não pode interagir com seu bloco) e outros métodos para definir os novos dados da chave de atalho e, finalmente, chame o método updateTile() para obter .

  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()
  }

Interruptor de atalho de operação

Se você quiser fechar a barra de notificação e pular para uma determinada página ao clicar no botão de atalho, chame o seguinte método:

startActivityAndCollapse(Intent intent)

Se você quiser abrir uma caixa de diálogo para interação ao clicar no botão de atalho, chame o seguinte método:

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

Como a opção de atalho pode aparecer quando o usuário bloqueia a tela, o julgamento de isLocked() deve ser adicionado. A caixa de diálogo só aparecerá quando a tela não estiver bloqueada.

Se o botão de atalho contiver informações confidenciais, você precisará usar isSecure() para julgar a segurança do dispositivo. Somente quando o dispositivo estiver seguro, você poderá executar a lógica relacionada ao botão de atalho (como a lógica de clicar). Quando o dispositivo está inseguro (o telefone está no estado de tela bloqueada), você pode chamar unlockAndRun(Runnable runnable) para solicitar que o usuário desbloqueie a tela e execute uma operação executável personalizada.

Acho que você gosta

Origin blog.csdn.net/qq_24252589/article/details/131387835
Recomendado
Clasificación