[android] App Shortcuts Tutorial
https://catinean.com/2016/10/20/exploring-android-nougat-7-1-app-shortcuts/
-
-
Android N ( Nougat ) 7.1 버전부터 사용 가능.
-
Shortcut 이 설정된 앱은 롱 프레스를 하면 위의 스샷처럼 바로가기 옵션이 나온다.
-
간단한 정리
특정 동작을 진입과 동시에 할 수 있다는 것이 키 포인트
static 과 dynamic shortcut 2가지 종류가 있다.
static 은 xml 에 정의하여 앱 안에 내용이 정의되어 있다. ( 수정하려면 앱 수정 및 재배포를 해야 한다. )
dynamic 은 Runtime 에 바꿀 수 있다.
shortcut 으로 앱을 열 때 activity back stack 을 만들 수 있다.
static shortcut 은 항상 하단에 오며, xml 수정을 통해 순서를 바꿀 수 있다.
dynamic shortcut 은 static shortcut 위쪽에 오며, rank 를 이용하여 dynamic shortcut 간 순서를 조정할 수 있다.
shortcut 의 label 은 CharSequence 이기 때문에 Spannable 을 먹일 수 있고, 이것이 적용된다.
shortcut 은 총 5개까지 정의할 수 있다.
-
Shortcut 적용은 Android Nougat 7.1 단말과 shortcut 을 지원하는 Launcher 가 있어야 한다.
글을 쓰는 시점에 잘 알려진 Launcher 는 Pixel Launcher 또는 Now Launcher 이다.
Static Shortcut
1. Shortcut XML 작성
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled=“true”
android:icon="@drawable/ic_static_shortcut"
android:shortcutDisabledMessage="@string/static_shortcut_disabled_message"
android:shortcutId="static"
android:shortcutLongLabel="@string/static_shortcut_long_label"
android:shortcutShortLabel="@string/static_shortcut_short_label”>
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.catinean.appshortcutsdemo.StaticShortcutActivity"
android:targetPackage="com.catinean.appshortcutsdemo" />
</shortcut>
</shortcuts>
enabled
false 이면 노출이 안되거나, Shortcut 이 Launcher 에 “고정(Pin)” 되어 있다면, 회색으로 dimm 이 되고 선택하면 shortcutDisabledMessage 가 Toast 로 표시된다.
shortcutShortLabel
대부분의 경우 이 녀석이 display 가 된다. Launcher 에 여유공간이 많을 때에만 간혹 LongLabel 이 나올 수 있다.
2. Manifest 의 MainActivity 의 level 에 static shortcut 을 정의한 xml 파일을 meta-data 로 등록해준다.
<activity
...
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</application>
3. 바로 결과를 확인할 수 있다.
4. Activity Stack 을 쌓고 싶다면, shortcut 정의에 intent 를 순차적으로 적어주면 된다.
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
...>
<intent
android:action="android.intent.action.MAIN"
android:targetClass="com.catinean.appshortcutsdemo.MainActivity"
android:targetPackage="com.catinean.appshortcutsdemo" />
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.catinean.appshortcutsdemo.StaticShortcutActivity"
android:targetPackage="com.catinean.appshortcutsdemo" />
</shortcut>
</shortcuts>
Dynamic Shortcut
-
ShortcutManager 와 ShortcutInfo.Builder 를 통해 생성할 수 있다.
https://developer.android.com/reference/android/content/pm/ShortcutManager.html
https://developer.android.com/reference/android/content/pm/ShortcutInfo.Builder.html
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo webShortcut = new ShortcutInfo.Builder(this, "shortcut_web")
.setShortLabel("catinean.com")
.setLongLabel("Open catinean.com web site")
.setIcon(Icon.createWithResource(this, R.drawable.ic_dynamic_shortcut))
.setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("https://catinean.com")))
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(webShortcut));
-
Activity Stack 을 쌓고 싶다면, setIntent 대신 setIntents 를 통해 Intent[] array 를 전달해주면 된다.
-
Dynmaic Shortcut 은 setRank(int) 를 통해 순서를 정할 수 있다.
ShortcutInfo webShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_web")
.setRank(1)
.build();
ShortcutInfo dynamicShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_dynamic")
.setRank(0)
.build();
shortcutManager.updateShortcuts(Arrays.asList(webShortcut, dynamicShortcut));
rank 는 낮은 값일수록 아래쪽으로 간다. 당연히 높은 같이 더 위쪽으로 간다.
cf) 위의 코드에서 또 한가지 주목할만한 것은 동일한 id 로 이미 shortcut 이 정의되어 있다면 ShortcutManager.updateShortcuts 를 통해 해당 shortcut 을 업데이트 하여 모든 정보를 다 정의해줄 필요는 없다.
기타 내용
-
Dynamic shortcut 의 경우 Label 이 CharSequence 를 받기 때문에 Spannable 을 이용하여 글자를 stylish 하게 가져갈 수 있다.
( 필자가 알기론 framework 기능만 사용하여 xml 을 통해 Spannable 을 만들고 적용하는 것은 없는 것으로 알고 있다. 있다면 static shortcut 도 가능할듯.. )
ForegroundColorSpan colorSpan = new ForegroundColorSpan(getResources().getColor(android.R.color.holo_red_dark, getTheme()));
String label = "catinean.com";
SpannableStringBuilder colouredLabel = new SpannableStringBuilder(label);
colouredLabel.setSpan(colorSpan, 0, label.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
ShortcutInfo webShortcut = new ShortcutInfo.Builder(MainActivity.this, "shortcut_web")
.setShortLabel(colouredLabel)
.setRank(1)
.build();
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Messaging Style Notification Tutorial (0) | 2018.03.01 |
---|---|
[android] Direct Reply Tutorial (0) | 2018.02.28 |
[android] Google Sign In 서버로 검증하기 #3 (0) | 2018.02.24 |
[android] Google Sign In 코드 짜기 #2 (0) | 2018.02.23 |
[android] Google Sign In 준비하기 #1 (2) | 2018.02.22 |
댓글