Things take time

[Android] 안드로이드 오레오(Oreo)이상 부터 사용 되는 바로가기(ShortCut) 본문

Android(기능)

[Android] 안드로이드 오레오(Oreo)이상 부터 사용 되는 바로가기(ShortCut)

겸손할 겸 2018. 5. 11. 14:56

[개요]


http://g-y-e-o-m.tistory.com/44

해당 포스팅은 오레오 미만(25이하)에서 잘 동작하는 바로가기 아이콘 만드는 방법이다.


https://developer.android.com/about/versions/oreo/android-8.0-changes?authuser=2&hl=ko


안드로이드 오레오 변경사항을 알려주는 도큐먼트

이전에 분명 대응을 다했다고 생각했는데, 바로가기 쪽을 빼먹었나 보다.



중간쪽을 읽다보면 위와 같은 내용이나온다.

오레오 부터는 암시적 브로드캐스트(여기서 암시적이란 것은 상수 값처럼 이미 정해진 값이며 안드로이드가 암묵적으로 알고 있다는 것을 의미한다. 암묵적 인텐트처럼)의 사용을 제한이 더 엄격해졌다고 한다. (누가부터 시작)


그러므로 이제 직접 구현하라는 의미이다. 26이상이므로 targetSDK를 낮추는 것도 방법이지만.. 낮춘다 하더라도 사용자 핸드폰 설정에 따라 원하는 기능이 구현 안될 수도 있다고 한다.


(참고 사이트 : https://medium.com/til-kotlin-ko/android-o%EC%97%90%EC%84%9C%EC%9D%98-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-jobintentservice-250af2f7783c)



[바로가기 공식]


https://developer.android.com/preview/features/pinning-shortcuts-widgets.html?authuser=2&hl=ko


앱 target이 누가 7.1이상이라면 사용하라는 ShortcutManager

공식 도큐먼트에 따르면 shortcut은 크게 3가지가 있다.


1. 정적(static) 바로가기

2. 동적(dynamic) 바로가기

3. 고정(pinned) 바로가기


여기서 내가 사용할 것은 3. 고정형이며 이는 기존에 사용하고 있는 바로가기와 동일하기 때문이다. 고정형은 7.1(25)보다 한 단계 높은 26부터 사용가능하다. 1, 2는 25부터 사용 가능한 듯 하다.

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Log.i("createShortCut Oreo", "OREO!");
            Intent oreoIntent = new Intent(mContext, SplashActivity.class);
            oreoIntent.setAction(Intent.ACTION_MAIN);
            oreoIntent.putExtra("contentURL", url);

            ShortcutManager mShortcutManager = mContext.getSystemService(ShortcutManager.class);

            if (mShortcutManager.isRequestPinShortcutSupported()) {
                // Assumes there's already a shortcut with the ID "my-shortcut".
                // The shortcut must be enabled.
                if (bitmap == null) {
                    // pinShortcutInfo
                    Drawable drawable = ResourcesCompat.getDrawable(mContext.getResources(), R.mipmap.ic_launcher, null);
                    bitmap = ((BitmapDrawable) drawable).getBitmap();
                }

                // id는 고유값으로
                ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(mContext, name)
                        .setShortLabel(name)
                        .setLongLabel("long")
                        .setIcon(Icon.createWithBitmap(bitmap))
                        .setIntent(oreoIntent)
                        .build();
                
                Intent pinnedShortcutCallbackIntent = mShortcutManager.createShortcutResultIntent(pinShortcutInfo);


                // Configure the intent so that your app's broadcast receiver gets the callback successfully.
                PendingIntent successCallback = PendingIntent.getBroadcast(mContext, 0,
                        pinnedShortcutCallbackIntent, 0);

                Boolean isSuccess = mShortcutManager.requestPinShortcut(pinShortcutInfo,
                        successCallback.getIntentSender());

                if (isSuccess){
                    Toast.makeText(mContext, "'" + name + "' 바로가기가 바탕화면에 생성되었습니다.", Toast.LENGTH_LONG).show();
                }
            }
        }

바로가기 아이콘에 넣을 intent를 선언한다. 웹으로 연결하는 ACTION_VIEW를 한다던지, 하는 암묵적 인텐트는 원하는 걸로 설정하고 필요 시 데이터도 넣는다.


그리고 getSystemService로 ShortcutManager를 생성하고, isRequestPinShortcutSupported() 함수를 통해 디바이스가 해당 기능을 지원하는지에 대한 여부를 알 수 있다.


그리고 ShortcutInfo 인스턴스를 생성하는데, 이 인스턴스에서 중요한 것은 id(생성자의 두 번째 파라미터, name 부분)와 shortLabel이다.

id를 중복되게 사용하면, 해당 바로가기를 재사용할 수 있고, 고유 값으로 설정할 때 마다 새로운 아이콘이 생성된다.



[제거]

                    List ids = null;
                    ids.add("my-shortcut");
                    mShortcutManager.disableShortcuts(ids);

제거도 간단하다.