Android Studio/실습위주

안드로이드 스튜디오 - 데이터 저장하기(SharedPreferences)(2)

루체도 2019. 11. 20. 01:14

이전 글에 이어서 SharedPreferences에 대해서 다루도록 하겠습니다.

이전 글에서는 ListView에 List들을 생성하기 위한 Adapter를 만드는 것을 했습니다.

SharePreferences란 무엇인지 이전글에서 대략적으로 적어놨기 때문에 바로 코드로 들어가보겠습니다.

 

우선적으로 어플리케이션리스트에서 가져온 어플리케이션을

SharedPreferences를 이용해서 저장을 해보도록 하겠습니다.

Button을 클릭했을 때 받은 Result로 아래 코드가 실행이 됩니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //데이터를 넘겨받는데 성공한 경우에 if문으로 들어간다.
    if(requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null){
        ApplicationInfo info = data.getParcelableExtra("info");
        Drawable icon = info.loadIcon(getPackageManager());
        //mShortcut은 클래스의 매개변수
        mShortcut.setImageDrawable(icon);

		//SharedPreferences를 불러온다.
        //Manager를 이용한 방법 말고도 다른 방법도 있다.
        //그냥 getPreferences()로 불러와도 된다.
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
		//저장을 하기위해 Editor를 불러온다.
        SharedPreferences.Editor edit = preferences.edit();
        edit.putString("shortcut", info.packageName); //key, value로 저장한다
        edit.apply();
     }
}

저장을 했으면 어플리케이션을 껏다가 켰을 때 ImageView에 저장된 것이 들어가 있어야 하므로

onCreate에서 저장된 데이터를 찾아줘야 합니다.

main 보라색이 어플 아이콘부분

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mShortcut = findViewById(R.id.shortcut_image);

        //safe된 값이 있나 없나 확인 하는 것
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String packageName = preferences.getString("shortcut", null); // shortcut키에 값이 없을 때 null값을 저장을 하겠다.
        if(packageName !=null){
            try {
                Drawable icon = getPackageManager().getApplicationIcon(packageName);
                mShortcut.setImageDrawable(icon);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

 

그리고 Main화면에서 이미지를 클릭하면 해당 어플이 실행되어야 하므로 그와 관련된 메소드도 작성을 해야합니다.

    public void onImageClicked(View view) {
        ImageView imageView = (ImageView)view;
        Drawable drawable = imageView.getDrawable();
        if(drawable != null){
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            String packageName = preferences.getString("shortcut", null);

            if(packageName !=null){
                Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
                startActivity(intent);
            }
        }
    }

저장되어있는 이미지가 있다면 shortcut이라는 key로 어플리케이션의 이름을 등록을 해놨기 때문에

그것을 불러와서 Intet 형식으로 만들어 StartActivity로 해당 어플을 실행해줍니다.

 

이상으로 SharedPreference를 어떻게 사용하는지에 대해서 마무리가 되었습니다.

여기서 마무리되면 글이 뭔가 텅텅 빈 느낌이라 다른 방법으로

SharedPreferences를 가져오는 방법에 대해서도 간단하게 적고 마무리하겠습니다.

SharedPreferences sp = getSharedPreferences(SHARED_PW,MODE_PRIVATE);

 "SHARED_PW" 이 이름의 저장소를 생성한 어플리케이션에서만 사용가능한 모드(MODE_PRIVATE)로 생성한다.

SHARED_PW라는 이름의 저장소가 이미 있으면 가져와서 사용하고 없으면 새로 생성을 해서 만듭니다.

뒤에 MODE_PRIVATE에는 다양한 값들이 들어가므로 필요에 따라서 바꿔서 생성을 해주면 됩니다.

 

SharedPreferences.Editor editor = sharedPref.edit();
editor.remove(키값);
editor.commit();

위의 코드는 이미 저장되어 있는 데이터를 찾아내서 remove를 하는 것입니다. 그리고 지웠으면 commit을 통해

동기화를 시켜줘야 합니다. 위의 editor를 불러오는 것은 헷갈릴까봐 적어놓은 것이니 신경안쓰셔도 됩니다.

 

이상으로 SharedPreferences를 활용한 데이터 저장에 대한 글을 마치도록 하겠습니다.

//전체코드

public class MainActivity extends AppCompatActivity {


    public static final int REQUEST_CODE = 1000;

    private ImageView mShortcut;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mShortcut = findViewById(R.id.shortcut_image);

        //safe된 값이 있나 없나 확인 하는 것
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String packageName = preferences.getString("shortcut", null); // shortcut키에 값이 없을 때 null값을 저장을 하겠다.
        if(packageName !=null){
            try {
                Drawable icon = getPackageManager().getApplicationIcon(packageName);
                mShortcut.setImageDrawable(icon);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    public void onImageClicked(View view) {
        ImageView imageView = (ImageView)view;
        Drawable drawable = imageView.getDrawable();
        if(drawable != null){
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            String packageName = preferences.getString("shortcut", null);

            if(packageName !=null){
                Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
                startActivity(intent);
            }
        }
    }
    public void onButtonClicked(View view){
        Intent intent = new Intent(this, AppListActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null){
            ApplicationInfo info = data.getParcelableExtra("info");
            Drawable icon = info.loadIcon(getPackageManager());

            mShortcut.setImageDrawable(icon);

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

            SharedPreferences.Editor edit = preferences.edit();
            edit.putString("shortcut", info.packageName);
            edit.apply();
        }
    }
    //뒤로 가기 버튼을 눌렀을 때 일어나는 것에 대해서 Override 하는 것
    @Override
    public void onBackPressed(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("종료 확인");
        builder.setMessage("정말로 종료하시겠습니까?");
        builder.setPositiveButton("확인", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.setNegativeButton("취소", null);
        builder.show();
    }
    /*
    onButtonClicked(View view)
    startActivityForResult(intent , 1000);
    초기에 1000의 숫자는 변수가 아니였다. 그런데 변수로 만들고 싶어졌다.
    타이핑을 하는 것이 아니라 1000에 Focus 를 해놓고 ctrl + shift + a 를 누르면 무슨 창이 뜬다
    거기에 constant 를 입력하면 밑에 명령이 쫙 뜨는데 거기서 맨위에 Extract 를 해주면 알맞은 변수명으로 자동으로 생성이 되게 된다.
    그래서 startActivityForResult(intent, REQUEST_CODE)로 변한 것이다.
    * */
}