Things take time

[Android] 바탕화면에 바로가기 아이콘(ShortCut) 만들기 본문

Android(기능)

[Android] 바탕화면에 바로가기 아이콘(ShortCut) 만들기

겸손할 겸 2017. 8. 16. 10:38

[ShortCut]


일명 바로가기 아이콘, 앱을 다운받으면 생성되는 아이콘도 있지만.. 카카오톡 같은 경우에는 각 채팅방의 바로가기를 만들어서, 해당 바로가기 클릭 시 그 대화방으로 이동하는 기능이 있다.


이 기능을 만드는 것으로 생각하면 된다.


그렇다면 기본적으로 생각해야할 것은? -> 각 바로가기에는 데이터가 들어가야한다. 그리고 앱의 액티비티에서는 그 데이터를 받아서, 해당 데이터에 따라 특정 작업을 수행해야 한다.



[로직]

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT">

숏컷을 생성하기 위한 권한을 추가한다. 위험권한은 아니므로 마시멜로 이상 기기에 대한 권한 팝업 설정은 따로 필요없다.


    public void createShortCut(String name){
        Log.i("createShortCut", "Call : " + name);

        //on Home screen
        Intent shortcutIntent = new Intent(mContext, SplashActivity.class);
        shortcutIntent.setAction(Intent.ACTION_MAIN);
        shortcutIntent.putExtra("content", name);
        shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);


        Intent addIntent = new Intent();
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                Intent.ShortcutIconResource.fromContext(mContext.getApplicationContext(),
                        R.drawable.intro));

        addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
        mContext.getApplicationContext().sendBroadcast(addIntent);
    }

인텐트가 두 개 있다.


shortcutIntent : 숏컷(바로가기) 아이콘을 클릭했을 때 발생하는 이벤트, 액티비티 등을 설정한다. 위 소스 기준으로 아이콘 클릭 시 SplashActivity로 이동하게 되며 content라는 key값으로 String값을 보낸다 (매개변수 값)

addIntent : 실질적으로 바로가기를 생성하게 하는 인텐트, "" 값들은 상수이며 여기에 EXTRA_SHORT_INTENT로 클릭 시 발생하는 데이터 들을 담은 숏컷인텐트를 넣어 보낸다.


마지막 줄의 mContext.get... 부분은 일반적으로 sendBroadcast(addIntent)만 사용하면 된다. 

 

 

*** 중요 : 아이콘 설정 방법

 

아이콘을 설정할 때는 앱의 Resource 폴더 안에 있는 파일을 참조하는 (R.drawable과 같은..)방법이 있지만, 만약 실행중에 해당 이미지를 바꿔주고 싶다면, 이야기가 달라진다.

 

기본적으로 Resource 폴더는 앱이 실행 되는 도중에 추가, 삭제할 수 없으며 컴파일 이전에 처리된다. 그러므로, 만약 카카오톡 바로가기처럼 대화방의 바로가기가 상대방의 프로필 사진으로 되는 경우라면, 바로가기가 생성되는 그 시점의 상대방 프로필을 얻어와야한다.

 

기본적으로 이미지 파일을 서버의 URI에서 전달받는 상황이라면, 중간의 addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(mContext.getApplicationContext(), R.drawable.intro)); 이 부분을 아래로 변경한다.


addIntent.putExtra("android.intent.extra.shortcut.ICON", bitmap);

bitmap은 당연히 비트맵 파일이어야 하고, URI값을 bitmap으로 변경하는 작업이 선행되어야한다.
 

[응용]


앞서 말한 것처럼 바로가기를 만드는 것에 끝내면 이 기능은 솔직히 필요없다. 카카오톡처럼 각각의 바로가기와 그에 대한 이벤트, 액티비티등을 바꾸고 싶다면, 위의 소스를 살짝 수정하면 된다. 액티비티를 바꾸고 싶다면 파라미터로 던져줘도 되고, 데이터를 전달하고 싶다면 나처럼 content란 값을 통해 인텐트에 넣어 보내면 된다.

위 소스 기준으로 SplashActivity.class의 onResume()에 아래처럼 넣는다. (onCreate에 해도 되지만, 이 때 onCreate에서 하려면 SplashActivity는 매니페스트에서 액티비티 설정에 launchMode를 설정해줘야한다. 왜? 무엇을? => 구글링


 String content = getIntent().getStringExtra("content");
                if(content != null) {
                    Log.i("content", content);
                }

여기서 찍히는 content의 값은, createShortCut의 파라미터인 name이 들어오게 된다. 이 값을 바탕으로 분기처리하여 특정 작업을 수행하면 된다. 응용 범위는 다양하므로 패스.