달력

12

« 2024/12 »

  • 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

리스트뷰와 리싸이클러뷰는 프로젝트를 할때나 간단한걸 만들어볼때나.. 거의 리스트를 보여주기위해 

자주 사용하는거라 한번쯤은 정리할 필요가 있는건 같아서 정리한다. 


정리한 내용이 부족할지라도 계속 채워넣을 예정이니까 도움이 되었으면 좋겠다! 


기록하는 습관은 중요하다고 생각한다. 작년이나 제작년에 한 내용들도 조금은 시간이 지났더라도 다시 차곡 차곡 

기록하려고 한다. 그리고 안드로이드 스터디할때 대략적으로 필요한 개념들이라서.. 


ListView란 무엇일까? -->일단 그림을 먼저보자 난 그림을 보면서 관계에 대해서 파악하는게 좋았다 ㅋㅋ !! 



리스트뷰를 알기전에 상위에있는 어댑터뷰에대해서 먼저 알아보자! 


1.어댑터뷰(AdapterView)

어댑터뷰는 그림에서도 보이듯이 ViewGroup의 하위 클래스다. 

어댑터뷰는 하위에  ListView, GridView, Spinner, Gallery등을 가지고 있다.

이런 어댑터뷰는 표시할 항목데이터(원본 데이터)를 어댑터(Adapter) 객체로부터 공급받는다. 


어댑터에도 종류가 있는데 정리하자면..


2.Adapter종류 

어댑터는 여러가지 아이템 중에서 하나를 선택하는 기능을 만들 때 많이 사용하는 클래스이고, 세로로 스크롤 되면서 리스트를 보여준다.  이런 위젯을 선택 위젯이라고 하는데 !


선택위젯은 어댑터(객체)를 사용하고 --> 어댑터는 원본 데이터를 읽어서 어댑터뷰에 제공! 

--->어댑터뷰는 화면에 데이터를 나타내는 역할을 한다.!  


어댑터는 데이터를 관리하고 뷰 객체를 만들어 리턴한다. 그러고나서 어댑터뷰에 항목으로 표시가 된다. 


 

                       Adapter종류

 ArrayAdapter

 배열에서 데이터를 가져온다. 

CursorAdapter 

 데이터베이스(DB)에서 데이터를 가져온다 

SimpleAdapter 

 xml 파일에 있는 데이터를 사용한다.  


어댑터를 사용하기위해서는.. !! 어댑터 객체를 생성해야한다. 

어댑터뷰마다 사용하는 파라미터가 있는데  


ArrayAdapter는 생성할때 3개의 파라미터를 사용한다. (커서랑 심플어댑터는 나중에 설명하겠음)


ArrayAdapter(Context context , int resourceld, T[] objects); 


context는 현재 컨텍스트 objects는 배열자료(원본 데이터)를 말한다. 


ArrayAdapter를 이용한 listview를 만드는 순서는 이렇다. 

1)원본 데이터를 String(문자열)로 만든다  String[]list = {"이순신","광개토대왕","신사임당", 등등등 } ;


2)어댑터를 생성한다(어댑터 역할: 원본 데이터를 가지고 가공해서, 어떻게 무엇을 보여줄지 정한다)

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);


-->여기서 simple_list_item은 한개의 텍스트뷰다! 


3)xml에 저장된 리스트뷰를 findViewById 메소드를 이용해서 ListView 객체에 대응시킨다.

ListView listview = (ListView) findViewById(R.id.ListView); 


4)리스트뷰 객체 어댑터를 설정한다. 이 작업을 통해서 화면에 데이터가 보여진다. 

listview.setAdapter(adapter);


5)항목을 터치했을 때 처리되는 이벤트를 넣는다. 

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){

 //처리할 내용  -->하나의 항목을 터치했을 때 처리되는 내용 기입 

}

} );



5)같은 경우는 항목을 터치했을 때 처리되는 이벤트를 주기 위해 사용하는 인터페이스다 

OnItemClickListener()인터페이스를 사용하는건 

버튼에 무명 클래스를 이용해서 리스너를 등록하는 방법과 같다. 


OnItemClickListener는 1개의 메소드(onItemClick)을 가지고있다. 

onItemCLick메소드는 사용자가 하나의 항목을 터치했을 때 자동으로 실행되는 콜백 메소드이고 4개의 파라미터를 받는다.


- adapterView : 클릭이 발생한 어댑터뷰 

- view : view는 사용자가 클릭한 항목에 해당하는 뷰이다. 

- i : Listview의 선택된 항목의 위치 

- l : 터치한 항목의 줄(row)    -->5)설명에 있는 리스너부분 파라미터 설명한거다!   


아까 String으로 리스트를 하나 만들었는데 항목을 터치했을대 항목에 대해 설명하는 창이 나오도록 하려면

배열 데이터를 하나 더 만들어야 한다. 


String[] list_explain = {

         ":조건시대의 장군. 임진왜란에서도 삼도수군통제사로 수군을 이끌고": +

"왜군을 물리치는 데 큰 공을 세웠다 " ,

   ":소수림왕의 정치적 안정을 기반으로 최대의 영토를 확장한" +

"고구려 19대 왕이다" ,  --> ...이런식으로! 

}


사용자가 하나의 항목을 터치했을 때 자동으로 실행되는 onItemClick안에 Toast클래스를 이용해서 

list와 list_explain 배열에 있는 데이터가 화면에 제시되도록 만들면 된다. 


아까 5)에 있던 내용에 


listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){

Toast.makeText(getApplicationContext(), ((TextView view).getText() +list_explain[i] , Toast.LENGTH_LONG).show();

}

// i값은 리스트뷰의 선택된 항목 위치다. 

} );


저코드는 토스트창을 띄워주는데  텍스트뷰를 클릭했을시에 텍스트를 가져오는데  

 i번째에있는 값이 클릭되면 거기에 들어있는 텍스트뷰 이름 예를들어 이순신 을 가져오고 

그 i값에 맞는 explain list를 가져오라는거다 

그럼 결국엔 getText로 이순신을 가져오고  list_explain으로 :조선시대의 장군~ .... 값을 가져온다 .



근데 꼭 리스트뷰를 텍스트로 만들어서 가져오지않고 

체크하는 아이템이라던가 여러개의 항목으로 만들어서 가져와도된다. 



이렇게 Array에 넣어서 하는 방법도 있고  


XML파일로 데이터에 입력해서 만드는 방법도 있다.

음 XML로 가져오는방법은 일단 생략하겠다 정리하려고 하는부분이 리사이클뷰가 주라서 


XML을 데이터로 입력해서 가지고 오려면 

getResources를 이용해서 xml로 저장되있는 데이터를 가져와서 list_explain변수에 담아서 사용한다. 


final String[] list_explain = getResources.getStringArray(R.array.achievement); 



ListActivity를 사용한 리스트뷰를 만드는 방법도 있다. 


Activity클래스를 상속하는 대신에 ListActivity 클래스를 상속받아서 리스트뷰를 작성하면 

SetContentView를 사용하지 않고도 리스트뷰를 만들 수 있다. 


또 리스트뷰 객체를 만들 필요도 없다. setListAdapter를 이용하면 내부 리스트뷰와 원본 데이터를 쉽게 연결할 수 있다. onListItemClick메소드를 사용하면 항목을 클릭했을 때 리스너 등록 없이 쉽게 이벤트 처리를 해결할 수 있다. 

onListItemClick메소드는 리스트뷰의 항목이 선택되면 자동으로 호출된다.


explain[]이라는 배열을 만들어 놓고, 


people = new ArrayList<String>( );

people.add("이순신");

people.add("강감찬");  -->이런식으로 사람을 붙여버린다! 

people.add("세종대왕");


그리고 


ArrayAdapter<String> mAdapter;


mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, people);

setListAdapter(mAdapter);

이렇게 붙여버리고 나서 아이템을 클릭했을때 처리는 어떻게 해주냐면 


public void onListItemClick(ListView l, View v, int position , long id){

String message;

message  = people.get(position)+":"+explain[position];

Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show( );


}


파라미터값이 position인거지 i 로 이름을 변경해줘도 된다. 

String으로 메세지를 선언해서 메세지 변수에 읽어오는 position값에 이름이랑 설명을 가져와서 변수에 넣어주는거다 

그럼 결국에는 message변수에는 이름:설명 이렇게 들어가서 토스트로 출력된다.



위에 설명들은 하나의 텍스트뷰로 구성되어있는 항목만 다룬건데 

그러면 하나의 항목에 1개의 이미지와 여러개의 텍스트뷰가 들어가게 하려면 어떻게 해야할까? 

--> 일반적으로 BaseAdapter를 상속해서 사용한다. 상속을 하게 되면 몇 개의 메소드를 사용할 수 있다!! 


BaseAdapter를 상속받으면 4개의 메소드를 오버라이딩 해야하는데 

특히 getCount메소드와 getView메소드가 중요하다.


네개는 다음과 같다.

(1) public int getCount( ) (2) public Object getItem( ) (3) public long getItemId( ) (4) public View getView( ) 


특히 중요한 두개의 메소드에 대해서 설명하겠다 !! 


  메소드

     기능 

getCount( )  

항목의 개수를 리턴해준다.  

get View( ) 메소드 

 각 항목에서 보여질 뷰를 리턴해준다. 항목의  개수만큼 반복 처리된다.

 3개의 파라미터를 받는다!

 첫 번째 파라미터는 항목(아이템)의 인덱스이다.

 두 번째 파라미터는 현재 인덱스에 해당하는 뷰 객체이다. 

 세 번째 파라미터는 뷰를 포함하고 있는 부모 컨테이너 객체이다. 


즉, getView( )메소드는 Adapter가 가지고 있는 데이터를 어떻게 보여줄지를 정의하는데 

사용된다.  




음 예를들어서 

나라그림에 어떤나라이고 나라에 대한 설명을 내가 리스트로 보여주고싶다! 

처음에 어떻게 할까? 일단 MainActivity에 ListView를 작성한다. 


그리고 메인액티비티 메인코드에서 이미지와 텍스트 데이터를 어댑터에 추가하고 사용자가 항목을 터치했을 때 

처리되는 내용을 AdapterView.OnItemClickListener( ) 에 사용하여 처리하면 된다.


총 

<java> 

IconDataBox.java

IconSetting.java

MainActivity.java

MyBaseAdapter.java


<res>

activity_main.xml

listlayout.xml 


string.xml에는 값 미리 넣어주고..



위에서 설명했던 내용처럼 리스트뷰랑 어댑터뷰를 일단 선언한다! 그리고나서?!!! 


1. 리스트뷰 객체를 참조한다. 

listView = (ListView) findViewById(R.id.listView);

-->내가 메인액티비티 레이어에서 선언해줬던거 


2.어댑터 객체를 생성한다(어댑터를 사용하려면 객체를 생성해줘야한다)

adapter = new MyBaseAdapter(this);


Resources res = getResources(); 


3.Strings.xml 안에 있는 데이터들을 가져와서 String배열에 넣는다.

위에 설명했던 방식처럼 


final String[ ] nation = getResources( ).getStringArray(R.array.nation); 

이렇게 이런 방식으로.. 가져온다!!

String[ ] explain = getResources( ).getStringArray(R.array.explain);  이렇게 등등등등 선언하면.. 

Srting[ ] population

final String[ ] capital 


위에 그림처럼 항목별 이미지 한개와 택스트 3개를 어댑터(데이터 관리 및 처리)에 넣는다. 


adapter.addItem(new IconDataBox(res.getDrawble(R.drawble.nation00),

     nation[0], explain[0], population[0]); 

nation나라 이미지를 , 나라이름 nation ,explain설명, 인구 population를 어댑터 데이터에 넣어준다. 

데이터가 10개라면 [0]~[9] 이런식으로 !! 쭉쭉 넣어준다 


getDrawble로 가져오는게 아까 위에 그림의 --> 이미지 고 

nation 텍스트 1

population 텍스트2 

explain 텍스트 3이다.



그리고 이제 리스트뷰에 어댑터를 설정한다


listView.setAdapter(adapter); 


//리스트뷰에서 한 항목이 터치 되면 처리한다.

아까 위에서 설명한 온아이템 클릭리스너!! 


listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

  

@Override   

   public void onItemClick(AdapterView<?> parent, View view , int position, long id){

IconDataBox currentItem = (IconDataBox) adapter.getItem(position);

String[ ] currentData = currentItem.getData( );

//포지션에 있는 값을 가져와서 currentData에 넣어주는거다.


//화면에 터치한 나라 이름과 수도 나타내기 


Toast.makeText(getApplicationContext( ) , nation[position] + ":" 

  +capital[position] , Toast.LENGTH_LONG).show( );

(아까 위에서 선언했던 친구들 다 불러오는거다 ) 

}

});

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {


getMenuInflater( ).inflate(R.menu.menu_main , menu);


return true;

}


@Override


public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId( );


if(id == R.id.action_settings){

return true;

}

return super.onOptionsItemSelected(item);

}


이제 메인 액티비티 부분은 끝났다. 이제는 아이템 항목을 위한 레이아웃을 넣어줘야 한다.


저위에 이런 형식이라고 보여준 이미지 부분! 저 레이아웃을 만들건데 

listlayout.xml  

처음에 리니어레이아웃을 수평으로 하여서 

이미지1과 텍스트3개를 수평으로 배치하고


두번째 리니어레이아웃에 텍스트1과 텍스트2를 하나로 묶어서 텍스트3과 수직으로 배치한다.


그다음 두번째 리니어레이아웃 안에 리니어레이아웃을 하나 더만들어서 텍스트1과 텍스트2를 수평으로 배치한다. 


listlayout.xml을 다루기 위해선 inflate개념에 대해 이해해야 하는데 


xml파일로 레이아웃을 만들었다 

그러면이제 리니어 레이아웃을 상속한 ItemView클래스를 만들어서 xml파일을 inflate해서 사용하게 한다. 


inflate는 --> xml안에 있는 버튼, 이미지뷰등 여러 위젯들을 

LayoutInflater 객체를 이용해서 inflate해서 매모리에 객체화되어 저장시킨다.  


Layout Inflater inflater = (LayoutInflater) context.getSystemService

(Context. LAYOUT_INFLATER_SERVICES);


inflater.inflate (R.layout.listlayout, this , true);


getSystemService는 Context 클래스의 메소드다. 

파라미터로 어떤 값을 전달하느냐에 다라서 다른 객체를 리턴해주는데 

LAYOUT_INFLATER_SERVICES를 파라미터로 전달했으며 

레이아웃 리소스를 inflate하는 LayoutInflater 객체를 반환하게 된다. 


itemView.java에서는 


리니어 레이아웃을 상속받고 


이미지뷰와 텍스트뷰를 선언해준다 

그리고 


public ItemView(Context context, ItemDataBox aItem){

super(context);

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context. LAYOUT_INFLATER_SERVICE);

inflate.inflate(R.layout.listlayout, this, this , true);


이렇게 가져온다!! 

myImage = (ImageView) find~~ 

myImage = setImageDrawble(aItem.getImage( ) ); 


이런식으로


MyBaseAdapter 클래스는 ArrayList형태의 ItemDataBox 클래스를 사용했다. 

그래서 마이베이스 어댑터클래스에는 


어레이 리스트를 이용해서 데이터를 저장하고

ArrayList<ItemDataBox> mItems = new ArrayList<ItemDataBox>( );

public void addItem(ItemDataBox item) {

mItems.add(item);  //ArrayList에 데이터를 추가한다. 

어댑터에 항목을 등록하고 -->이부분이 중요한다 


우리가 아까 메인액티비티 클래스에서 총 10개의 항목을 ItemDataBox 객체형태로 

만든후에 어댑터 항목으로 추가등록했는데 


ArrayList형태인 ItemDataBox에 모든 데이터를 넣도록 한다. 


adapter.addItem(new ItemDataBox(res.getDrable(R.drawable.nation 00), nation[0], population[0],explain[0]));


그리고 getView메소드.. 


MyBaseAdapter 클래스는 BaseAdapter클래스를 상속받아서 겟뷰메소드를 가지고있는데 

겟뷰메소드가 아까전에 어댑터에있는 모든 항목들을 화면에 나타나게 하는 역할을 한다고 했는데 


getCount메소드를 통해 항목의 개수를 얻을 수 있고, 그 개수만큼 getView 메소드가 자동으로 실행된다


ItemDataBox.java 는 


아이템 데이터박스 선언해서 데이터값을 가져온다. 

  

 그래서  MyBaseAdapter.java소스는 원본데이터를 가지고와서 관리하고 화면에 보여주는 역할을 한다. 


스크롤로 새로운 리스트가 보여질때 그 위치를 알아내서 getView메소드를 호출해서 뷰를 생성하고 화면에 보여주게되는데 이때 스크롤되서 사라진 항목을 다시 스크롤해서 보고자할 때 그 항목을 매번 새로 생성하면 비효율적이니까 


안드로이드는 그 뷰에대한 정보를 가지고잇다가 해당 리스트가 보여질때 자동으로 이미 생성되어있는 항목을

getView에 전달해줘서 같은것을 다시 생성하지 않게 해야한다. 


이런 역할을 convertView가 한다. --> 컨버트뷰는 안드로이드가 전달해주는 해당 리스트 항목의 뷰다.

convertView가 null 이라는 것은 처음으로 항목이 제시된다는 의미고, 

처음으로 리스트가 보여지기 때문에 new 연산자를 사용해서 새로 생성해야한다. 


convertView값이 null이 아니라면 생성되었다가 그 후 스크롤 때문에 화면에서 사라졌다가 

다시나타나는 경우기 때문에 이미 생성된 객체가 전달되며 이 객체에 필요한 데이터를 넣어서 리턴시키면 된다. 



Recycle View에 대해 설명하려고 했는데..  

리스트뷰를 쓰다보니까 많아져서.. 리사이클뷰에 대해 다음장에 서술하려고한다!! 








  


 

:
Posted by Gongdile

BR

백그라운드에서 실행되는 서비스와 통지,BR등에서 

사용자에게 알림을 보낼 수 있는 여러가지 방법에 대해 알아 보고 

앱 사이의 공식적인 통신방법인 BR제작을 실습하는거 


오늘 학원에서 통지 부분을 나갔다. 


백그라운드 프로세스는 어떤 사건 발생할때 사용자에게 확실하게 알릴만한 방법이 없음 


토스트가 있긴하겠지만

부재중 전화나 약속시간을 토스트만 잠시보여주고 말아버리면 곤란하잖음 

대화상자같은 경우도 사용자가 화면을 보기 전에는 확인하지 않아서 마찬가지임 


그래서 백그라운드 프로세스에서 사용자와 통신할 수 있는 더 확실한 방법이 필요한데 

그게 바로 통지(Notification)이다. 


우리 휴대폰 맨윗상단에는 상태란이있어서 

오른쪽에 시간, 배터리잔량 네트워크등이 표시되는데 


상태란의 왼쪽부분에 통지 아이콘이 나타난다.

부재중전화, 메시지나 배터리부족하다 usb연결 등등..알려줄때 


통지는 최초 잠깐만 보이지만 토스트와는 달리 사용자가 확인하기 전에는 아이콘이 계속 표시되고

소리, 진동, 불빛같은 적극적인 방법으로 신호를 보낼수있다. 

사건발생 사실만 아이콘으로 표시하고 구체적인 내용은 당장 보이지 않지만

상태란을 아래로 드래그해서 확장하면 상세한 정보가 출력되게말이다. 


통지 뷰의 모습은 버전이나 장비에따라 다르다.



통지를 그러면 어떻게 사용할까? 어떻게 출력하까 ㅋㅋㅋㅋㅋㅋㅋㅋ 

오늘 이것에 대해 배웠기 때문에 정리한다!!!


통지를 출력하려면 통지 관리자(NotificationManager)통지 객체(Notification) 둘을 사용한다. 


근데 이 둘을 사용하는데 준비해야할게 많아서 번거롭더라 


간단하게 말하면 이런느낌이다 : 인텐트 ~ -> 펜딩인텐드  ~-> notification~~


먼저 어떤 내용을 어떻게 알릴지 통지 객체를 생성하고 , 여러가지 속성을 원하는 대로 설정한다. 

통지 객체의 생성자는 이렇다.

Notification()
Notification(int icon, CharSequence tickerText. long when)

인수를 받지 않는 디폴트 생성자로 생성한후에 

속성을 설정하거나 아이콘, 티커텍스트, 통지발생시간등을 인수로 전달한다.


이전버전에서는 주로 생성자로 직접 통지 객체를 생성하고 

setLatestEventinfo 메서드로 선택시 동작을 정의했는데 


3.0이후에는 통지영역에 출력할 수 있는 옵션이 대폭적으로 늘어났다. 

그래서 빌저를 통해 객체를 생성하는 것으로 변경됨. 


빌더의 생성자는 이렇다. (사실 이런건 예제 한번 훅 보는게 더빠른듯)


Notification.Builder(Context context)

인수로 리모트뷰 생성에 사용할 컨텍스트를 전달하는데 통지 객체를 생성하는 액티비티를 전달한다.

이후에 다음 메서드로 통지 객체의 속성을 설정한다. 


속성의 종류가 굉장히 많아서 기본속성부터 정리하겠음


1.Notification.Builder  setTicker(CharSequence tickerText [ , RemoteViews views])

->티커 텍스트는 통지영역에 아이콘이 처음 나타날때 잠시 출력될 짧은 문자열이다.

   잠시만 보였다 금방 사라지지만 통지 전달 시점에 화면을 보고 있다면 

   티커 텍스트만 보고도 무슨일이 일어났는지 알 수 있다.

(단순 문자열 외에 커스텀 리모트 뷰를 지정하면 더 복잡한 정보도 출력할 수 있다.)

2.Notification.Builder  setWhen(long when)

->when은 통지가 발생한 시간을 지정하는데 

   System.currentTimeMillis 메서드로 구현한 현재 시간을 지정하는것이 보통이고 

   디폴트도 현재 시간으로 되어있다.

3.Notification.Builder  setSmallIcon(int icon [, int level])

->아이콘은 두가지 상태를 지정할 수 있는데 

   작은아이콘은 상태란 왼쪽에 티커 텍스트와 함께 표시되고, 상태란을 펼쳤을때 통지뷰에도 나타난다.

   또 티커 텍스트가 사라진 후에는 상태란에 작은 아이콘만 남아 통지가 발생했음을 알리는 역할을 한다.

  (면적이 그다지 넓지 않아서 작은아이콘만 표시할수있다.)

3.0이후에는 큰 아이콘도 추가로 표시할 수 있는데 통지 뷰에 나타난다.


큰아이콘이 없으면 작은 아이콘이 통지뷰에 대신 표시되지만,

큰아이콘이 지정되면 통지 뷰에는 큰 아이콘이 사용되며 작은 아이콘은 오른쪽에 표시된다. 

-->통지의 기능이 확장됨으로 인해서 단순히 사건 발생만을 알리는게 아니라 

    사건에 대한 정보를 표시하는 큰아이콘이 필요해졌다. 


4.Notification.Builder  setLargeIcon(Bitmap icon)

->큰 아이콘은 SNS 메시지의 사용자 사진, 멀티미디어 앱의 앨범 자켓 등을 보여주는 용도로 사용된다. 



아래 메서드는 통지 뷰에 대한 여러가지 속성을 설정한다.

(위에 메서드는 통지 객체의 속성 설정! 여기 아래는 통지 뷰에 대한 여러가지 속성 설정) 


Notification.Builder  setContentTitle(CharSequence title)

Notification.Builder  setContentText(CharSequence text)

Notification.Builder  setSubText(CharSequence text)

Notification.Builder  setContentIntent(PendingIntent intent)


-->통지 뷰에는 상단제목, 중간내용, 하단의 서브텍스트 등 총 3개의 문자열을 표시한다. 

모든 문자열을 다 표시할 필요는 없다. 필요한 만큼만 표시하면 된다. 

문자열이 많으면 오히려 너무 번잡스러워서 

제목에 사건 개요를 적고 내용에 상세 메시지 정도만 표시하는게 일반적이다.


사용자가 통지 뷰를 클릭했을 때의 동작은 setContentIntent 메서드로 펜딩 인텐트를 전달하여 지정한다. !!!!


그래서 아까 위에서 펜딩인텐트 얘기를 꺼낸거 !!!! 그래서 난이제 펜딩인텐트에 대해서 설명하겠다.


<PendingIntent>


펜딩인텐트 클래스는 인텐트를 래핑하며 다른 응용프로그램으로 전달하여 실행 권한을 준다. 

( 보통의 인텐트와 다르다. )


통지를 등록하는 앱과 통지 뷰를 관리하는 앱이 다르기 때문에 

일반 인텐트로는 의도를 전달할 수 없다.

펜딩 인텐트는 시스템이 관리하며 인텐트를 만든 으용프로그램이 종료되어도 유효하다. 


생성자가 정의되어 있지 않아서 객체를 직접 생성할 수 없고, 

아래에 있는 세개의 정적 메서드 중 하나로 생성한다. 


(1)PendingIntent getActivity (Context context, int requestCode, Intent intent, int flags)

(2)PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)

(3)PendingIntent getService (Context context, int requestCode, Intent intent, int flags)


얘네 세개의 메소드 차이는 인텐트로 무엇을 띄울 것인가에 따라 메소드가 나누어져 있다. 


액티비티를 띄울 예정이다 -->(1)메서드로 펜딩 인텐트를 생성한다.

context인수는 인텐트를 등록하는 주체이며 intent는 실행할 작업이다. 


펜딩 인텐트를 등록해 놓으면 시스템이 인텐트를 가지고 있다가 통지 뷰가 클릭될 때 내부의 인텐트를 실행한다. 


get Activity로 생성된 인텐트는 결국 startActivity를 호출하여 인텐트가 지정하는 액티비티를 띄운다. 

통지 뷰에서는 주로 액티비티를 띄우는데 

이 경우 인텐트에는 FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 새로운 태스크를 시작하게 한다. 

(2),(3) 메서드는 방송을 보내거나 서비스를 호출한다. 


펜딩인텐트에 관한 자세한 설명은

https://developer.android.com/reference/android/app/PendingIntent

여기 사이트에 있는데 영어다 !! 하하 ..ㅋㅋㅋㅋㅋ 


저 세개의 메서드중 flag부분에 대해서 더 자세하게 다뤄보려고 한다. 

저기 pending intent 에서 flag를 제공해주는데 


  • FLAG_CANCLE_CURRENT

-->이전에 생성된 펜딩인텐트는 취소하고 새롭게 하나를 만든다.

  • FLAG_NO_CREATE 

-->현재 생성된 펜딩인텐트를 반환한다.

  • FLAG_ONE_SHOT 

이 플래그를 이용해 생성된 펜딩인텐트는 단 한번 밖에 사용될 수 없다.일회용카드!!

  • FLAG_UPDATE_CURRENT

만일 이미 생성된 펜딩인텐트가 존재한다면 해당 인텐트의 내용을 변경한다. 


아까 위에서 설명할때 진동이나 빛 소리등으로 적극적! 으로 알릴 수 있다고 얘기했는데

그거와 관련된 빌더의 고급 속성 고급 메서드!!을 알아보자 



Notification.Builder  setLights(int argb, int onMs, int offMs)

-->통지 발생시에 장비의 LED를 깜박거리며 색상과 주기를 지정한다.

    모든 장비가 LED를 가지고 있지 않으며 지원하는 색상도 제한적이라서 반드시 제한된 색상대로 출력되는건 아니다.

Notification.Builder  setNumber(int number)

-->통지와 함께 숫자 하나를 보여주는데 여러 가지 의미로 사용된다.

ex))부재중 메시지 알림의 경우 총 몇 통의 메시지가 왔는지 표시하고 

    충전중 알림이라면 충전 진행 정도를 표시한다. 

Notification.Builder  setOngoing(boolean ongoing)

-->일회적인 알림이 아니라 음악 재생이나 싱크 등의 작업이 진행 중임을 나타낸다. 

    사용자가 통지를 직접 제거할수 없다. 코드에서 작업 완료시에만 제거할 수 있다.

 

Notification.Builder  setSound(Uri sound [ , int streamType])

Notification.Builder  setVibrate(long[ ] pattern)

--> 통지 발생시 사운드를 낸다던가 진동을 발생 시킬 수 있다.

통지는 주로 화면이 꺼진 상태에서 발생하므로 소리나 진동을 통해 사용자에게 적극적으 알리는게 좋다.


이런 모든 설정등이 완료되면 최종적으로 이 메서드를 호출해서 통지 객체를 생성한다.!!!


Notification build( )


=>빌더의 모든 메서드는 빌더 자신을 리턴하므로 연쇄적인 호출이 가능하다. 

    최종적으로 build 메서드를 호출함으로써 통지 객체를 생성한다


대부분 속성은 빌드 메서드로 지정하지만 통지 객체를 생성한 후에도 필드를 직접 조작할 수 있다. 

이전 버전에서는 필드를 직접 조작했지만, 지금은 빌더에 이런 속성들을 변경하는 메서드가 제공되서

가급적이면 빌더를 통해 속성을 설정하는 것이 좋다. 


필드 

설명 

number 

 통지 아이콘에 겹쳐서 출력될 숫자를 지정한다.

ex))새로운 메시지 도착했다는 통지라면 메시지 개수 같이 표시할 수 있다.

     0이나 음수를 지정하면 숫자가 표시되지 않는다.

sound 

통지와 함께 출력할 소리를 Uri 객체로 지정한다. 

vibrate 

진동 방식을 지정한다. 

진동할 시간과 멈출 시간을 배열로 전달해서 진동 패턴을 지정한다. 

ledARGB

불빛의 색상을 지정한다. 장비에 장착된 LED 능력에 따라 표현 가능한 색상은 달라진다.

ledOnMs 

LED 켤 시간과 끌 시간을 1/1000초 단위로 지정한다.

이 두 값은 LED점멸 주기를 지정한다. 

정확하진 않지만 장비는 가능한 근접한 시간을 지킨다.

ledOffMs 

defaults 

디폴트로 취할 통지 전달 방식을 지정한다.

flags 

통지의 동작 방식을 지정한다. 



주로 소리나 진동을 같이 사용하는데 소리 파일이다 진동 패턴을 직접 만들기는 번거롭다.

그래서 시스템은 디폴트 소리와 진동 기능을 제공하고 defaluts필드에 어떤 기능을 사용할건지 지정한다.



:
Posted by Gongdile

수업들으러 오후에오니.. 이미 포인터배열부분을 나가고있는 상태 ㅋㅋ.. 


헉..ㅋㅋㅋㅋㅋ 


포인터변환부분을 다루고 계신다 


0x 16진수.. --> 0x41424344; abcd드가는거 


리틀엔디안 -->작은주소값이 맨앞으로

빅엔디안 -->큰주소값이앞으로 ..


우리가 지금 사용하는 씨피유는 리틀엔디안 방식이라서 dcba가 들어감


포인터연산 더하기빼기 증가 감소 


int 형 포인터 p80번지 p+1은 84번지 


*p++주소가증가  (*p)++값이증가


포인터와배열은 밀접하다 거의같다고봐도됨 

배열이름이 바로 포인터다 

포인터는 배열처럼 사용이 가능하다. 

 

포인터는 배열처럼 사용할수있다 

인덱스 표기법을 포인터에 사용할수있다 


포인터가 인덱스표기법보다 빠르담 ㅇ_ㅇ ㅋㅋ 


배열명만쓰면주소.. 배열첨차스면 주소가됨 거기에 &를..


int a[5] ; a자체가주소임 아니면 &a[0]째 


int *p =a 

int *p=&a[0]

a가배열명인데 배열명자체가 주소 포인터변수임 

포인터변수에는 주소가 들어가자늠 


p는주소임 a의영번째주소 


*p 0번째 값 


a []

 a*-->a의영번째값 


*(a+0) = *p a[0]


int형으로 a배열방선언 

int a[]={10,20,30}

배열을 포인터처럼 사용해보자 

a만스면 얘는 주소야값이야? 배열명만써써 그럼얘는 주소임 

a 주소 

*a는? 배열을 포인터처럼쓸수있다햇자는 a번지의 값 a+1값이야주소야? 주소지 

*(a+1) = a[1] 

배열을 포인터 포인터를 배열처럼 바꿀수있게쪄?


배열의이름에 다른변수의 주소를대입할수있냐?? 

배열명에다가 다른변수주소대입못함 


변수주소는 포인터에다 집어넣어야함.. 


포인터이용해서 배열원소 참조할수있다. 

포인터를 배열이름처럼 사용할수있음 !! 


값에의한 호출과 참조에의한 호출 설명해주심. .


값에의한호출은 값복사해서주는거임 원본주는게아니라 그래서 안바뀜..


배열로받으나 포인터로받으나 똑가틈 


참조에의한호출...원본전달 뿁! 




:
Posted by Gongdile

2018_04_19_목

 

모든프로그램메인에서 시작

 

국비수업에서 만든다는건 ->new의미 //클래스로 준비되어있는놈의미

 

스레드없이 자동움직이는 프로그램을 만든다? -->! 불가능! 뀨뀨!

 

-----------

 

스레드구현방법은

스레드를 상속받거나 러너블이라는 인터페이스를 구현하는 방법이다..

 

start run이라는함수를 호출해주는함수

start를 굳이해주냐 ??

 

쓰레드는 하드웨어적으로 직접실행이라 바로실행하는걸 부담시러워함

그래서 안전하게 start라는메소드를 호출하게해서

시스템내에서 체크가이루어지고 아무이상없으면 시작 !

 

--

앞으로 안드로이드 공부하게되면 통신관련해서 어떤일을해야한다하면

무조건쓰레드임

 

스마트폰관렪서 통신해야할일많음

그래서어쩔수업싱 쓰레드관련해서 공부할수밖에엄슴 ㅋㅋ..

 

NANR- >안드로이드가 반응이없다..맵이멈춰버리는 다운되는. .

이럴때 메모리킬! 이상태벌어짐 주기버림 다른앱싷ㄹ행되게

 

그래서 안드로이드에서  쓰레드가 메인을 못건드리게함

 

주소를저장하는변수

 

뉴가하는일세가지

 

램에 클래스를 만들어놈 .-> 인스턴스 한국말로 객체

클래스가객체가됨 실체객체를만들어줌

 

만들어준 주소가 반드시이슴 그 주소를 반드시 변수에넣음

 

그레퍼런스변수가 인스턴스를 가르키게됨

 

그래서 레퍼런스변수 똔느 인스턴스변수 라고하는거임 그리고 일반변수 프리미티타입

 

 

멤버변수는뭐냐? 클래스를 이루는 멤버변수.. 필드라하는데

그 클래스를이루는함수 그걸함수ㄹ안하고 메서드라 부르지

 

씨언어의 외부변수 사용해봄?

예를들어 메인이있음

int x=5;

main(){

int x=15; //지역변수

 

           while(){

           int x=25; //이안에서는 x 25  지역깡패님 지역변수

           왜지역변수냐 고지역변수에서만놈 여기를빠져나오는순간사라짐

           자동변수라고도함. .ㅋㅋㅋㅋ       

}

}<--요애를 블럭이라고함

 

근데밖에 sum이라고다른함수가있다.

 

sum(){

x  -->>얘뭐찍힘? 5지 전국짱..전역변수라함 ㅎㅎ

 

}

 

근데자바에서는 쟤네전체를 크래스로묶음

class test{

int x=5;  전역변수 ->필드라캄

main(){ c에서함수라한거를 자바에서는메소드라함

int x=15; //지역변수

 

           while(){

           int x=25; //이안에서는 x 25  지역깡패님 지역변수

           왜지역변수냐 고지역변수에서만놈 여기를빠져나오는순간사라짐

           자동변수라고도함. .ㅋㅋㅋㅋ       

}

}<--요애를 블럭이라고함

 

근데밖에 sum이라고다른함수가있다.

 

sum(){

x  -->>얘뭐찍힘? 5지 전국짱..전역변수라함 ㅎㅎ

 

}

 

}

 

c언어에서는 test.c 자바에서는 test.java

 

시언어에서 파일하나를 자바에서는 클래스라고함..

 

씨언어잘하는데 자바못하면 개바보임

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

단지왜어렵냐 용어가 너무많음 자바는 ㅋㅋㅋㅋ

 

 

우리는클래스맨들면

 

씨언어는전부다스태틱이라보믄댐

자바는 스태틱제외하고는 만들어져서

new로 맨들어씀 ..

스캐너에들어있는 next int 같은거 new로만들어줘야지

 

레퍼런스변수,생성자 (클래스이름과똑같은이르므이함수),생성자호출

 

걔가실행되니까문제가뭐냠 상속을받아버리니까 자식생성햇더니

부모생성자 자동호출됨

 

이런거공부할라하니까머리터짐

---------

구조를익히고나면 잘넣으면됨자바찡

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

안드로이드는 자바클래스만이용하는거임 ㅇ_

다클래스로준비되어있음

손가락으로 톽! 플리핑이라함

똑같은속도움직이는거 스크롤링

 

우린자바에서 무브라카고..드래그라하고..형태는똑같음 이름만달름

콤보박스를 안드로이드에서 스피너라캄

 

그래서완벽하게구조알고들어가면

할때편함 큐큐큐

네비게이션기능/롤링,피칭.. 등등등 plaplapla

 

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

그래서 sdk ndk pdk개발자 /그래서 단계별로 외우는거

어디취업해서1년동안 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

샤람이됨..죤냐게공부하기.. 일년되면다암..

아무리날고기어도취업시켜노면 일년되면똑같아짐 다사람취급을 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

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

//학원다니는동안 기본에충실하자

--

기본적으로문법이나개념에 충실하면 짜집기잘할수이슴

 

내가윈도우로 창하나만든다할때..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

c->c++->win API->MFC ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ씨언어찡..

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

첨에 mfc안나온거 winapi로공부해서즘 윈도우운영구조 알아야함

------

시슈템프로그래먼 ->c언어에대해서알아야함 .

 

지금나가는것들은거의클래스사용법임

 

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

Thread Runnnable이 있었음

스레드는 클래스로 러너블은 인터페이스임

따라서 제는 익스텐트 쟤는 임프리먼트로 받아야함

 

둘다 런이라는메소드 오버라이딩해놓음됨

마이쓰레드라는놈으로 상속받는다면

 

MyThread t = new MyThread()

           t.start(); //하면 저 런안에가 막실행됨

run {

 

 

}

 

마이투가 샹쇽받는다면

My2Thread tm = new My2Thread();

Thread tmm=new Thread(tm);

 

생성자로 한번감싸야함. . 쓰레드안에다가 내가맨든거 감싸야함

 

tmm.start();

 

근데 만들어서 집어넣으나 걍집어서서 쓰나 도긴개긴

 

쓰레드를사용하다보니까

 

------

오늘뭐나가냐 생성자 스레드  소비자스레드 가이슴

 

생성자스레드 맨들어서 안에다 차곡차곡넣음

근데 안에가꽉차면 집어넣을수엄슘

그럼 대기보다 쉬는게나음

 

소비자스레드는 계속꺼내서씀 근데 다꺼내씀

그럼 더이상꺼낼게없음 그럼쉬는게나음

이소비자쓰레드는 채워진건신경안서도됨 대신비엇는지가 걱정됨

비어잇음 쉬믄댐

 

비어서쉬고있는데 얘가만들어서 쉬고있었음

그럼어케함? 깨워줘야지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

야 갖다채움 가져가야지

깨워줌

 저안에있는놈 공통객체..

 

콜렉션클래스사용해서 집어넣고 어레이리스트같은거사용해서

20개넘어가면 야쉬삼~~ 니가쉬삼~하고프로그래밍하면

스레드적절하게사용해서 시물레이션프로그래밍도 가능함 뿅!

 

스레드의 동기화

 

우리가 atm의 동기화를 생각해보자

동시에 접근시에 동시에빠져나가? 이럼 큰일남

동시에접근하는걸 못하도록하기위해서 동기화작업을 진행해야함 ㅎㅅㅎ

예를들어 두군데에서동시에 접근을햇음

 

내부적으로 락걸어주는게

synchronise라고 함수앞에 선언해버림

싱크로나이즈라고 선언하면 선언되어있는 이함수가 실행되고있는 동안에는

다른스레드가 접속하면 다른함수 대기하고있게됨

다실행하고끝나면 그때 락풀기 그래야 그때인출할수이슴

그럼그때 돈이없음 뀨뀨

 

a라는 쓰레드가 가라는함수호출해씀 가라는함수에서 나라는함수호출

 

여기서비라는쓰레드가 나를호출 나에서 가를호출

 

이렇게생겨먹은 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 그런데 얘네들이다 싱크로나이즈가 걸려있음 비가실행행해서가를호출해봐 되게씀? 노노 

에이에서 가에서 나호출할라햇는데 호출되겟음? 노노 à이런경우를 교착상태의 기아상태 라고함

파워를뽑아야함ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 요런걸조심하기

 

공통으로 접근안하게할려면그 임의의 코드블록을 임계영역으로 지정해서ㅕ 싱크로나이즈 하는방법도이슴

공통으로 실행안됫으면 하는부분을 묶어서 뿅..

대부분 일반적으로 함수앞에다써주지만 대신 예를들어

쓰레드의 실행되야할내요이 너무많아 근데그중일부분만 이게포함된다면

다른부분실행되야하기 때문에 적절하게 싱크로나이즈블록사용해서 하면될거같다

 

Th.join()은 뭐냐

자바는 메인이끝나면 프로그램이 끝나자늠 그러면 화면에서 프레임은 사라졋음 근데 음악소리는 계속 나겠지 

화면은사라졌는데 음악은안멈춤

> 메인은화면을없앴는데 메인에서만든 쓰레드가 소리를만드는줌임 음악

스레드가끝날때까지 윈도우가 사라지지않는거 이게 조인임

691쪽부터 실습문제 요거.. 1번부터 쭉 5번까지 해보기

예제 2 화면하나에 레이블붙여놓고 카운팅시작하는거

예제를 스스로하는것도 중요하지만 예제를 통해서 해보는것도 중요함 1번부터 5번까지 한번내용을 쭉 읽어보기 ..

 

연습문제 1~5번으로공부하기 처음부터짜는거 너무고민하지말기

시간이 좀 많이 걸림

스레드를 이용하지않는 프로그램이없기 때문에 한번 해보기

--

13-4예제

랜덤함수 수시로 좌표값바구기

범위를한정해서 바꾸는거  왜냐면 너무넓ㄱ세왓다갓다하면 진동같지않으니까  

------------------2번예제랑 3번예제랑 5번예제 나갔는데

지금 일단 정리해둔거 올린거라서 오타도많고 좀 더러운데 나중에 수정하기

 

'[국비]자바기반 응용SW과정 > 일지 ' 카테고리의 다른 글

2018-05-02 C언어 수업  (0) 2018.05.02
:
Posted by Gongdile