HttpURLConnection 을 이용해서 http status code 받아 오기

프로그래밍/ANDROID|2020. 12. 21. 10:16
반응형

아래와 같은 내용으로 접근하려는 웹서버의 http status code 를 확인 할 수 있습니다.


StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);


URL url;

HttpURLConnection connection = null;


try {

    url = new URL("http://sysdocu.tistory.com");

    connection = (HttpURLConnection) url.openConnection();

    Toast.makeText (DetailsActivity.this, "응답 결과 : " + connection.getResponseCode(), Toast.LENGTH_SHORT).show();

} catch (IOException e) {

    e.printStackTrace();

} finally {

    if (connection != null) {

        connection.disconnect();

    }

}



반응형

댓글()

안드로이드 진동 기능 사용하기

프로그래밍/ANDROID|2020. 12. 18. 15:34
반응형

진동 효과를 사용하기 위한 권한과 시간 설정만 하면 간단히 사용이 가능합니다.


1. AndroidManifest.xml

<uses-permission android:name="android.permission.VIBRATE"/>


2. MainActivity.java

특정한 패턴으로 반복 동작하고 싶은 경우 아래와 같이 사용하면 됩니다.


Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

long[] to_long = {0,  // 0초 대기, 2초 진동, 1초 대기, 2초 진동... 반복 (총 1분)

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000,

                            2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000, 1000};다.

vibrator.vibrate(to_long, -1);  // 0 은 반복, -1 는 반복 안함


취소 방법

vibrator.cancel();

반응형

댓글()

안드로이드 모든 TextView, Button 폰트 일괄 변경 (Custom Font)

프로그래밍/ANDROID|2020. 12. 18. 12:41
반응형

안드로이드 앱 내의 모든 TextView 나 Button 폰트를 일괄적으로 변경, 적용하려면 다음과 같이 진행합니다.



1. 폰트 저장


res/font 디렉토리 내에 ttf 파일을 저장합니다.


예) nanumgothicbold.ttf



2. 스타일 설정


values/style.xml 파일 또는 themes/themes.xml 파일 수정


<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="Theme.Sysdocu" parent="Theme.MaterialComponents.DayNight.DarkActionBar">

        <item name="colorPrimary">@color/purple_500</item>

        <item name="colorPrimaryVariant">@color/purple_700</item>

        <item name="colorOnPrimary">@color/white</item>

        <item name="colorSecondary">@color/teal_200</item>

        <item name="colorSecondaryVariant">@color/teal_700</item>

        <item name="colorOnSecondary">@color/black</item>

        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>


        <!-- 아래 정의 해놓은 폰트 적용 -->

        <item name="android:textViewStyle">@style/nanumTextView</item>

        <item name="android:buttonStyle">@style/nanumButton</item>


    </style>


    <style name="nanumTextView" parent="android:Widget.TextView">

        <item name="android:fontFamily">@font/nanumgothicbold</item>

    </style>


    <style name="nanumButton" parent="android:Widget.Button">

        <item name="android:fontFamily">@font/nanumgothicbold</item>

    </style>


</resources>


이제 빌드 후 확인해보면, TextView 와 Button 에서 사용하는 폰트는 자동 적용된 것을 볼 수 있습니다.




반응형

댓글()

Android RecyclerView + ItemTouchHelper - 드래그 앤 드롭, 스와이프

프로그래밍/ANDROID|2020. 12. 18. 08:45
반응형

* 참고

아래 소스대로 구현시 Activity 에서 item 값을 가져오고 싶을 경우에 사용 하면 됩니다.


String aa = ((TextView) mRecyclerView.findViewHolderForAdapterPosition(1).itemView.findViewById(R.id.tv_name)).getText().toString();


* 1 : array 번호

* name : tab_item.xml 에서 가져올 요소 이름


주의할 점은, 화면을 벗어난 item 의 정보를 가져올 경우 null 값이 반환 되어 오류가 발생됩니다.

그럴땐 아래와 같이 사용하면 됩니다.


for(int i = 0; i<Objects.requireNonNull(mRecyclerView.getAdapter()).getItemCount(); i++) {

            if (mRecyclerView.findViewHolderForLayoutPosition(i) != null) {

                View childView = Objects.requireNonNull(mRecyclerView.findViewHolderForLayoutPosition(i)).itemView;

                TextView tv_name = childView.findViewById(R.id.tv_name);

                String name = tv_name.getText().toString();

                Toast.makeText(getBaseContext(), "아이템 NAME : " + name, Toast.LENGTH_SHORT).show();

            }

        }




그럼 살펴보도록 합니다.




[출처] https://jroomstudio.tistory.com/27


RecyclerView + ItemTouchHelper -> Drag and Drop과 swipe 구현 

 

실행화면

 

자바 클래스 및 인터페이스

 

레이아웃

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
        android:id="@+id/rv_tab_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@layout/tab_item"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
 
 

tools:listitem -> 리사이클러뷰에 추가 될 레이아웃을 지정한다. 

 

tab_item.xml -> 추가될 아이템 레이아웃 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="60dp"
    android:orientation="horizontal"
    android:paddingEnd="20dp"
    android:paddingStart="20dp">
 
 
    <TextView
        android:id="@+id/name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:textColor="@android:color/primary_text_light"
        android:textSize="20sp"
        android:text="TAB NAME" />
 
 
    <FrameLayout
        android:id="@+id/drag_handle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_gravity="center"
            android:src="@drawable/ic_drag_handle" />
    </FrameLayout>
 
</LinearLayout>
 
 

 

아이템 레이아웃

TabItem.java 모델

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class TabItem {
 
    private String name;
    private int number;
 
    public TabItem(String name, int number){
        this.name = name;
        this.number = number;
    }
 
    public int getNumber() {
        return number;
    }
 
    public void setNumber(int number) {
        this.number = number;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
 
 

아이템 레이아웃에 셋팅 될 Tab name과 리스트 순번을 모델 객체가 저장하고 반환한다. 

  

ItemTouchHelperListener.java 인터페이스

1
2
3
4
public interface ItemTouchHelperListener {
    boolean onItemMove(int form_position, int to_position);
    void onItemSwipe(int position);
}
 
 

RecylcerView의 Adapter 클래스에서 상속받는다. 

onItemMove -> 아이템의 현재 위치와 이동 위치를 입력받아 아이템 리스트에의 위치를 수정하도록 구현 

onItemSwipe -> 아이템의 포지션값을 받아 해당 아이템을 Swipe할때 로직을 구현 

 

ItemTouchHelperCallback.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
 
    private ItemTouchHelperListener listener;
 
    public ItemTouchHelperCallback(ItemTouchHelperListener listener) { this.listener = listener; }
 
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView,
                                @NonNull RecyclerView.ViewHolder viewHolder) {
        int drag_flags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
        int swipe_flasg = ItemTouchHelper.START|ItemTouchHelper.END;
        return makeMovementFlags(drag_flags,swipe_flasg);
/* 참고하실 부분은 onMove와 onSwipe중 하나만 사용하겠다라고 하신다면 getMovementFlags에서 return을 해주는 makeMovementFlags함수의 인자로 0을 넣어주시면 됩니다. 예를 들면, onMove만 사용(onSwipe 사용안함) - return makeMovementFlags(drag_flags,0); onSwipe만 사용(onMove 사용안함) - return makeMovementFlags(0,swipe_flags); 출처: https://everyshare.tistory.com/27 [에브리셰어] */
    }
 
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
                          @NonNull RecyclerView.ViewHolder viewHolder,
                          @NonNull RecyclerView.ViewHolder target) {
        return listener.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
    }
 
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        listener.onItemSwipe(viewHolder.getAdapterPosition());
    }
 
    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

ItemTouchHelperCallback 생성자

-> 해당 클래스를 생성할 때 ItemTouchHelperListener를 입력받아 멤버 인스턴스로 지정하고 ItemTouchHelper.Callback이 지원하는 여러 메소드를 오버라이딩 하여 필요에 따라 사용한 후  결과값들을 반환해 준다.  아이템 위치변경 , 스와이프 , 롱클릭 등 다양한 기능을 지원한다.  

getMovementFlags

-> 리사이클러뷰와 리사이클러뷰 뷰홀더를 입력받는다.

-> drag 위치와 swipe 위치를 ItemTouchHelper에서 받아 셋팅한다.

-> makeMovementFlags() 메소드로 drag위치와 swipe 위치를 입력하여 현재 위치값을 int로 반환해준다.  

onMove

-> 리사이클러뷰,viewHolder, target(viewHolder 중 선택된 아이템)을 입력받아 움직임을 감지한다. 

-> ItemTouchHelperListener의 onItemMove메소드로 해당 아이템의 움직임을 감지한다.

-> onItemMove 메소드는 아이템이 움직이고 있는 가를 판별하고 boolean 값으로 반환한다.  

onSwiped

-> 리사이클러뷰의 뷰홀더와 움직일 방향을 입력받는다.

-> ItemTouchHelperListner의 onItemSwipe메소드에 움직일 방향을 입력하여 swipe를 구현한다.  

isLongPressDragEnabled() 

-> true를 반환하도록 설정하면 롱클릭을 감지한다. 

 

TabListAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class TabListAdapter extends RecyclerView.Adapter<TabListAdapter.ItemViewHolder>
                            implements ItemTouchHelperListener{
 
    private ArrayList<TabItem> items = new ArrayList<>();
 
    public TabListAdapter(){}
 
    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.tab_item, parent, false);
        return new ItemViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
    }
 
    @Override
    public int getItemCount() {
        return items.size();
    }
 
    public void setItems(ArrayList<TabItem> itemList){
        items = itemList;
        notifyDataSetChanged();
    }
 
    @Override
    public boolean onItemMove(int form_position, int to_position) {
        TabItem item = items.get(form_position);
        items.add(to_position,item);
        item.setNumber(to_position);
        notifyItemMoved(form_position, to_position);
        return true;
    }
 
    @Override
    public void onItemSwipe(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }
 
    public class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tabName;
        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            tabName = itemView.findViewById(R.id.name);
        }
        public void onBind(TabItem item,int position){
            tabName.setText(item.getName());
            item.setNumber(position);
        }
    }
}
 
 

-> RecyclerView.Adapter 를 상속받는다.

Adapter에는 RecyclerView.ViewHolder를 상속받은 내부 클래스를 구현하고 제네릭으로 지정하여 상속받아야 한다.  

-> ItemTouchHelperListener를 상속받아 onItemMove과 onItemSwipe를 오버라이딩하여 행동을 구현해준다. 

-> TabItem 모델을 제네릭으로 지정한 ArrayList를 생성한다. 

--------------------------------------------------------------

RecyclerView 상속 오버라이딩 메소드 

onCreateViewHolder

-> 리사이클러뷰에 추가될 item 레이아웃을 연결한다. 

-> ItemViewHolder 클래스에 View(item레이아웃)를 입력한다. 

onBindViewHolder 

-> ItemViewHolder와 아이템의 리스트상 위치를 입력받는다. 

-> ItemViewHolder 내부에 구현한 onBind 메소드에 아이템 리스트에서 포지션값으로 아이템을 선택하여 입력한다. 

getItemCount

-> items의 전체 갯수 숫자를 반환한다.

setItems

-> 메인액티비티에서 TabItem 객체를 생성한 후에 리스트를 입력하여 어댑터의 멤버 items에 매치시킨다. 

-> notifyDataSetChanged메소드로 데이터가 셋팅되었음을 알린다. 

--------------------------------------------------------------

ItemTouchHelperListener 오버라이딩 메소드

onItemMove

-> 아이템의 리스트상 현재위치와 움직일 위치를 입력받느다.

-> 입력받은 값으로 아이템의 이동을 구현한다. 

-> notifyItemMoved 메소드로 데이터가 이동함을 알린다. 

 

onItemSwipe

-> 포지션값을 입력받는다.

-> 포지션값으로 아이템리스트의 해당 포지션 아이템을 삭제한다.

-> notifyItemRemoved 메소드로 데이터가 삭제되었음을 알린다. 

 

ItemViewHolder 클래스

ItemViewHolder

-> 아이템 레이아웃의 name TextView 와 연결한다. 

onBind

-> TabItem객체에 셋팅된 값으로 각각의 레이아웃에 셋팅 한다. 

 

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class MainActivity extends AppCompatActivity {
 
    private RecyclerView mRecyclerView;
    private TabListAdapter mAdapter;
    private ItemTouchHelper mItemTouchHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mRecyclerView = (RecyclerView) findViewById(R.id.rv_tab_list);
 
        LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext());
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(manager);
 
        mAdapter = new TabListAdapter();
        mRecyclerView.setAdapter(mAdapter);
 
        mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(mAdapter));
 
        mItemTouchHelper.attachToRecyclerView(mRecyclerView);
 
        ArrayList<TabItem> items = new ArrayList<>();
        TabItem item1 = new TabItem("SUBSCRIBE",0);
        TabItem item2 = new TabItem("BEST",0);
        TabItem item3 = new TabItem("MUSIC",0);
        TabItem item4 = new TabItem("SPORTS",0);
        TabItem item5 = new TabItem("GAME",0);
        TabItem item6 = new TabItem("MOVIE",0);
        TabItem item7 = new TabItem("NEWS",0);
        TabItem item8 = new TabItem("LIVE",0);
        items.add(item1);
        items.add(item2);
        items.add(item3);
        items.add(item4);
        items.add(item5);
        items.add(item6);
        items.add(item7);
        items.add(item8);
 
        mAdapter.setItems(items);
 
    }
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

-> 리사이클러뷰를 생성한다.

-> 리사이클러뷰에 LinearLayoutManager를 활용해 속성을 지정한다. 

-> 리사이클러뷰에 TabListAdpater를 셋팅한다. 

-> 어댑터를 입력한 ItemTouchHelperCallback 클래스를 ItemTouchHelper 생성자에 입력하여 생성한다.

-> TouchHelper 의 attachToRecyclerView 메소드를 활용해 Touch를 구현할 리사이클러뷰를 연결한다. 

-> TabItem 을 제네릭으로 받는 ArrayList를 생성하고 임의의 값을 셋팅한다.

-> 어댑터의 setItems 메소드에 해당 ArrayList를 입력한다. 


[출처] https://jroomstudio.tistory.com/27





반응형

댓글()

activity 간 데이터 전달

프로그래밍/ANDROID|2020. 12. 17. 10:20
반응형

[ 방법1 ]


보내는 Activity


Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);


받는 Activity


@Override

protected void onCreate(Bundle savedInstanceState) {

    Intent intent = getIntent();

    String value = intent.getStringExtra("key");

}


[출처] https://stackoverflow.com/questions/4186021/how-to-start-new-activity-on-button-click



[ 방법2 ]


Intent 사용 없이 전역 변수에 넣어 어느 Activity 에서든 쉽게 데이터를 공유하고 싶을 경우

아래 포스팅을 참고 합니다.


https://sysdocu.tistory.com/1053



반응형

댓글()

안드로이드 CDT (CountDownTimer) 반복 작업을 종료하는 두 가지 방법

프로그래밍/ANDROID|2020. 12. 14. 13:55
반응형

경우에 따라 반복문 내에서 반복적으로 작업을 진행하다가 조건에 맞아 종료하기도 하고,

외부 버튼을 통해 종료해야 할 경우도 있습니다.

두 가지 경우에 대해 종료하는 방법입니다.

 

int TTL = 1;


CountDownTimer CDT = new CountDownTimer(1000 * 86400 * 365, 1000) {
            public void onTick(long millisUntilFinished) {
                    result.setText(TTL + "\n");
                    // 지금이 10번째였다면 반복 중지 (CDT 내에서 종료할 경우)
                    if (TTL == 11) {
                            cancel();
                    }
                    TTL = TTL + 1;
            }
            public void onFinish() {
                // CountDownTimer 반복문 종료시 실행할 구문
            }
}; 


// 밖에서 버튼이나 특정 이벤트를 통해 종료할 경우
CDT.cancel();

 

 

결과

 

1

2

3

4

5

6

7

8

9

10

 

반응형

댓글()

안드로이드 네트워크 연결 여부 확인하기

프로그래밍/ANDROID|2020. 12. 14. 12:56
반응형

int status = NetworkStatus.getConnectivityStatus(getActivity().getApplicationContext());


        // 모바일이나 wifi 에 연결이 된 경우

        if (status == NetworkStatus.TYPE_MOBILE || status == NetworkStatus.TYPE_WIFI) {

            Toast.makeText (this, "Network connection success", Toast.LENGTH_SHORT).show();


        // 네트워크 연결이 되지 않은 경우

        } else {

            Toast.makeText (this, "Network connection failed", Toast.LENGTH_SHORT).show();

        } 



반응형

댓글()

[Android, Java] String 클래스에서의 특수문자 인식

프로그래밍/ANDROID|2020. 12. 11. 12:50
반응형

1. []으로 싸주면 문자 자체로 인식하는 것들. 


*  ⇒ [*] 

+  ⇒ [+] 

$  ⇒ [$] 

|  ⇒ [|] 



2. \\를 붙여줘야 하는 것들. 


( ⇒ \\( 

) ⇒ \\) 

{ ⇒ \\{ 

} ⇒ \\} 

^ ⇒ \\^ 

[ ⇒ \\[ 

] ⇒ \\] 



3. 자바의 특수문자는 \을 쓴다. 


 " ⇒ \" 



4. 나머지 부호들은 괜찮은 듯 하다. 

확인된 것. 


! # % & @ ` : ; - . < > , ~ ' 


ex ) 위에 놈들 다 지워 보자. 


    String c = "!\"#$%&(){}@`*:+;-.<>,^~|'[]"; 

    c = c.replaceAll("!\"#[$]%&\\(\\)\\{\\}@`[*]:[+];-.<>,\\^~|'\\[\\]", ""); 



출처: https://lazli.tistory.com/47 [lazli's Programming]



반응형

댓글()

TextView 터치 이벤트 발생 시키기

프로그래밍/ANDROID|2020. 12. 8. 08:53
반응형

TextView tv_close = (TextView) findViewById(R.id.tv_close);


tv_close.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View viewIn) {


        // 이벤트 내용 (Activity 종료)

        finish();


    }

});



반응형

댓글()

안드로이드 ArrayList 중복 제거하기

프로그래밍/ANDROID|2020. 12. 4. 16:50
반응형

String[] goodsList = {"notebook", "TV", "monitor", "keyboard", "mouse", "TV", "monitor", "keyboard"};

ArrayList<String> arrayList = new ArrayList<>();


for(String item : goodsList){

    if(!arrayList.contains(item))

        arrayList.add(item);

}


System.out.println(arrayList);



결과 = [notebook, TV, monitor, keyboard, mouse]



[출처] https://lnsideout.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%EB%B0%B0%EC%97%B4-ArrayList-%EC%A4%91%EB%B3%B5%EC%A0%9C%EA%B1%B0-%EB%AA%A8%EB%93%A0%EB%B0%A9%EB%B2%95

반응형

댓글()

앱 프로세스 완전 종료하기

프로그래밍/ANDROID|2020. 12. 4. 15:07
반응형

안드로이드 앱은 액티비티의 집합으로 이루어져 있다. 생명주기도 액티비티마다 제각각이고 시작시점과 종료시점도 때로는 불분명한 것이 안드로이드의 현 주소이다. 가장 단순한 시나리오인 앱의 종료에 있어서도 생각할 것이 많다. 액티비티만 종료를 한다면 앱의 프로세스가 살아 있어서 예기치 못한 부작용이 나타나기도 하고, 앱의 프로세스만 종료하면 Task List에 앱이 여전히 남아있는 등, 다양한 문제가 나타난다.

여러 가지 실험 결과 앱을 완전히 종료하기 위해서는 다음의 스텝을 따라야 한다는 것을 깨달아서 남겨본다. 태스크를 백그라운드로 이동 -> 액티비티 종료 -> Task List에서 지우기 -> 앱 프로세스 종료. 이 중 하나만 빠져도 예기치 못한 상황이 발생한다. 아직까지는 이 방법으로 문제가 없는데, 앞으로도 문제가 없길 바라면서...

앱을 완전 종료하는 방법:

moveTaskToBack(true);						// 태스크를 백그라운드로 이동
finishAndRemoveTask();						// 액티비티 종료 + 태스크 리스트에서 지우기
android.os.Process.killProcess(android.os.Process.myPid());	// 앱 프로세스 종료

혹시 태스크 리스트에 앱이 남기를 원하는 경우는 다음과 같이 하면 된다:

moveTaskToBack(true);
finish();
android.os.Process.killProcess(android.os.Process.myPid());

혹시 액티비티만 죽이고, 프로세스는 계속 실행하려면 다음과 같이 한다:

moveTaskToBack(true);
finishAndRemoveTask();

Fin.


[출처] https://calvinjmkim.tistory.com/21



반응형

댓글()