안드로이드

안드로이드 타일 서비스로 퀵 타일버튼 만들기

마리오64 2019. 10. 19. 22:46

안드로이드 앱들 중에 설치하면 타일 등록해서 바로가기 처럼되어있는 앱 들이있는데요

어떻게 했는지 궁금했는데 이번에 Q슬라이드 단축키 등록하려고 보게되었습니다.

구글에서는 타일서비스를 바로가기가 아닌 뷰없이 기능을  끄고, 켜는데에만 쓰라고 권장하는군요.

상단바를 내리면 보이는 퀵 타일들

타일서비스는 안드로이드 7.0부터 지원됩니다.

먼저 Manifest에 서비스를 등록해야합니다.

<service
    android:enabled="true"
    android:name=".QslideTileService"
    android:label="@string/filemgr"
    android:icon="@drawable/ic_folder"
    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
   <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true"/>
      <intent-filter>
         <action android:name="android.service.quicksettings.action.QS_TILE" />
    </intent-filter>
</service>

 

퀵세팅 타일권한과 (android.permission.BIND_QUICK_SETTINGS_TILE)

퀵타일 이벤트를 받을 인텐트필터 설정을 합니다.

타일이름과 아이콘은 메니페스트에서 하는 방법과 아래 TileService를 상속받아 TileLister에서 후에 설정 할 수도있습니다.

// ex)메시지앱 바로가기할 타일

public class MessageTile extends TileService {

  @Override
  public void onClick() {
  super.onClick();
   ComponentName componentName = new ComponentName("com.android.mms","com.android.mms.ui");


  try {
    startActivityAndCollapse(getActivityIntent(componentName));
    }catch (Exception e){
    getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
         Toast.makeText(this, "해당 어플이 없습니다.", Toast.LENGTH_SHORT).show();
    }
       onStopListening();
  }

  @Override
  public void onTileRemoved(){
  	super.onTileRemoved();
  }

  @Override
  public void onTileAdded(){
    super.onTileAdded();
  }

  public static Intent getActivityIntent(ComponentName activity) {
    Intent intent = new Intent();
    intent.setComponent(activity);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    return intent;
  }

}

타일 서비스를 상속받으면

onClick , onTileAdded(), onTileRemoved() 그밖에 타일 버튼 눌렀을때 리스너, 리스너 정지 메소드 등이 있는데요

바로가기만 할꺼라면 클릭메서드만 보면 됩니다.

타일을 클릭하면 타일 리스너가 실행되는데 앱을 켜고 계속 사용자를 기다리기 때문에

stopListening()메서드로 정지시켜야 합니다

public static Intent getActivityIntent(ComponentName activity) {
  Intent intent = new Intent();
  intent.setComponent(activity);
  intent.putExtra("com.lge.app.floating.launchAsFloating", true);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  return intent;
}

액티비티를 실행하려면 어플의 패키지이름과 해당 액티비티 이름을  ComponentName 형에 넣고

인텐트에 FLAG_ACTIVITY_NEW_TASK ,FLAG_ACTIVITY_CLEAR_TOP 플래그를 설정하면 액티비티를 켤준비가 다되었습니다.

패키지명, 액티비티명만 정확히 알면 다른 앱에 있는 공개된 액티비티도 실행 할수있는데요.

액티비티런처를 이용하면 패키지이름과 액티비티이름 목록을 알수있어서

플레이 스토어에 흔히있는 바로가기 앱을 만들 수도있습니다.

 

 

타일서비스를 이용하여 메시지앱과 전화앱들을 등록해보았습니다.

타일 서비스하나당 타일 하나씩만 등록되는군요.