# 안드로이드 애플리케이션 타입 4가지
1) <activity> </activity>  액티비티 (화면)
2) <service> </service>   서비스(백그라운드 서비스)
3) <receiver> </receiver> 브로드캐스트 리시버(이벤트 수신)
4) <provider> </provider> 컨텐트 프로바이더 (데이터 처리)

# 실습 3일차 
[GPS컨트롤]
1. 레이아웃 : my_gps.xml
- LinearLayout에 CheckBox 추가 (id는 cb_gps)

2. 액티비티: MyGPS.java onCreate에서 GPS의 설정을 읽어와 체크박스에 on/off로 표시함
1) onCreate 오버라이딩
setContentView(R.layout.my_gps);
CheckBox cb_gps = (CheckBox)findViewById(R.id.cb_gps);

2) GPS 설정상태 읽어오기
String gs = android.provider.Settings.Secure.getString(getContentResolver(),
android.provider.Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (gs.indexOf("gps", 0) <  0) {
    cb_gps.setChecked(false);
    cb_gps.setText("GPS꺼짐");
} else {
    cb_gps.setChecked(true);
    cb_gps.setText("GPS켜짐");
}

3. cb_gps 체크 상태가 변경 되면 GPS 설정화면으로 이동 
cb_gps.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
     @Override
     public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) {

      }
});

4. onCheckedChanged에  GPS 다이얼로그 띄우기 

      new AlertDialog.Builder(MyGPS.this)
      .setTitle("GPS 설정")
      .setMessage("GPS 설정변경")
      .setPositiveButton("GPS 설정변경", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent (android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                      startActivity(intent);
          }
      }).show(); 

[폰 배경화면 설정하기]

1. 퍼미션 추가
<uses-permission android:name="android.permission.SET_WALLPAPER"/>

2. imgBtn클릭 리스너 설정 (setOnClickListener이용)

3. imgBtn의 onClcik에 다음 내용 추가
WallpaperManager wallpaperManager = WallpaperManager.getInstance(MyImageView.this);
iv.setDrawingCacheEnabled(true);
try {
      wallpaperManager.setBitmap(iv.getDrawingCache());
} catch (IOException e) {
      e.printStackTrace();
}

[EditText 실습]
1. MyEditText.java를 수정

1) OK버튼을 누르면 입력한 글자로 검색을 실행하게 한다. 
     Intent intent = new Intent(Intent.ACTION_SEARCH);
     intent.putExtra(SearchManager.QUERY, 에디트텍스트에 입력된 값); 
     // ed.getText().toString()
     startActivity(intent);

2) CANCEL 버튼을 누르면 에디트 텍스트에 입력된 글자를 지운다.
     ed.setText("");

2. my_edit_text.xml 수정

1) TextView에 다음의 3개 속성 추가
    android:textColor="#FFFF00"
    android:textStyle="bold"
    android:textSize="20px"

2) EditText에 다음의 2개 속성 추가
   android:hint="글자를 입력하면 글자수를 체크합니다"
   android:singleLine="true"

[MyScrollView 수정]

1. Button 추가하기 (for 문 안에)

Button btn = new Button(this);
btn.setText("Button " + i);
layout.addView(btn);

2. Button을 wrap_content로 추가하기

Button btn = new Button(this);
btn.setText("Button " + i);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(btn, p);


3. 정렬
if(i%2==0) { // 짝수
    p.gravity = Gravity.RIGHT;
} else { // 홀수
    p.gravity = Gravity.LEFT;
}


# 실습 4일차
[Wifi, 3G 네트워크 상태확인]
1. 레이아웃 - my_wifi.xml
1) RadioGroup 추가: id는 rdg
2) RadioGroup 안에 RadioButton 2개 추가, id는 각각 rb_wifi, rb_3g, text는 "Wifi 연결", "3G 연결"

2. MyWifi 액티비티 - onCreate오버라이딩
1) setContentView
2) findViewById (rb_wifi, rb_3g)
3) wifi 상태 확인

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if(info!=null) {
   if(info.getType()==ConnectivityManager.TYPE_WIFI) {
       rb_wifi.setChecked(true);        
   } else if (info.getType()==ConnectivityManager.TYPE_MOBILE) {
       rb_3g.setChecked(true);              
   }
}

3. 퍼미션 추가
android.permission.ACCESS_NETWORK_STATE

4. Wifi 켜고 끄기
1) rb_wifi의 setOnCheckedChangeListener에 다음 코드 추가
  WifiManager wm = (WifiManager)getSystemService(WIFI_SERVICE); 
  wm.setWifiEnabled(isChecked);

2) 퍼미션 추가
android.permission.CHANGE_WIFI_STATE

[MySpinner 수정]
1. my_spinner.xml: Spinner밑에 Gallery추가
<Gallery android:id="@+id/gal" 
   android:spacing="20px"
   android:background="#0000FF"
   android:layout_width="fill_parent"
  android:layout_height="wrap_content" />

2. MySpinner 액티비티에 어댑터 연결
Gallery gal = (Gallery)findViewById(R.id.gal);
ArrayAdapter<String> gal_adt 
= new ArrayAdapter<String>(this, android.R.layout.simple_gallery_item, items);
gal.setAdapter(gal_adt);

[Spinner 데이터표시 방법]
1. 레이아웃 my_site.xml 생성 (LinearLayout)
1) Spinner 추가: id는 sp
2) Button 추가: id는 btn, text는 '이동'

2. MySite 액티비티 onCreate오버라이딩
1) setContentView호출
2) findViewById (sp, btn)
3) items 배열 선언 (사이트주소는 알아서)
String[] items = {"http://okgosu.net", "http://daum.net", "http://paran.com"};

3. ArrayAdapter연결
ArrayAdapter<String> adapter 
= new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);

4. btn을 클릭하면 스피너에 선택된 주소로 이동
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s1.getSelectedItem().toString()));
startActivity(intent);

[MyListView 수정]
1. 컨텍스트메뉴 선택시 명시적인텐트 호출(선택된 아이템에 해당하는 클래스)
: onContextItemSelected 함수에 다음 코드 추가
try {
   Intent intent = new Intent(this, Class.forName("kcdi.android." + item.getTitle()));
   startActivity(intent);
} catch (ClassNotFoundException e) {
  e.printStackTrace();
}

2. 옵션메뉴 선택시 암시적 인텐트 호출(선택된 아이템에 해당하는 액션값)
1) onOptionsItemSelected 함수 내용
     startActivity(new Intent(item.getTitle().toString()));

2) 인텐트 필터 추가 
MyImageView에 다음 인텐트 필터 추가
<intent-filter>
   <action android:name="myimage"/>
   <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

MyTextStyle에 다음 인텐트 필터 추가
<intent-filter>
   <action android:name="mytext"/>
   <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

MyWebView에 다음 인텐트 필터 추가
<intent-filter>
   <action android:name="myweb"/>
   <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

[MyAppList] : 설치된 App 정보 추출

1. MyAppList.java 라는 ListActivity 작성
//멤버변수 선언
private ArrayList items = new ArrayList();
private List appList;

2. onCreate함수 오버라이딩
// 설치된 앱리스트 객체 추출 (PackageManager)
appList = getPackageManager().getInstalledApplications(0);

// 어댑터에 사용할 배열(ApplicationInfo) 초기화 (Iterator패턴 사용)
Iterator itr = appList.iterator();
while (itr.hasNext()) {
  ApplicationInfo info = (ApplicationInfo)itr.next();
  items.add(info.packageName);
}

3. ListView 어댑터 설정
1) ArrayAdapter 생성
ArrayAdapter<String>  adapter 
= new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, items);

2) ArrayAdapter 설정
setListAdapter(adapter);

[MyAppList] - 단계2
ArrayAdapter에서 레이아웃을 android.R.layout.simple_list_item_1 대신에 커스텀 레이아웃을 사용하도록 한다.

1. ListView에서 사용할 행에 대한 레이아웃 생성: my_app_row.xml

1) LinearLayout에 ImageView와 TextView를 추가
2) 각각 id는 img, text1
3) ImageView의 src속성은 @drawable/icon으로 설정

2. ArrayAdapter를 다음과 같이 변경

ArrayAdapter<String>  adapter2 
= new ArrayAdapter<String> (this, R.layout.my_app_row, R.id.text1, items);

setListAdapter(adapter2);

[MyAppList] - 단계3

// 아이템을 선택하면 삭제 화면으로 이동(삭제 요청 인텐트 발생)

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
   Intent i = new Intent(Intent.ACTION_DELETE);
   String pname = (String) l.getItemAtPosition(position);
   i.setData(Uri.parse("package:" + pname)); // 인텐트에 패키지 정보 Uri 추가
   startActivity(i);
}


[앱 설치, 삭제 이벤트 감지]

1. MyAppReceiver extends BroadcastReceiver 클래스 생성

2. onReceive 오버라이딩
String act = intent.getAction();
String data =intent.getData().toString();
Toast.makeText(context, act + ":" + data, 1000).show();

* 참고
act 값이 android.intent.action.PACKAGE_ADDED 면 패키지 추가
android.intent.action.PACKAGE_REMOVED 면 패키지 삭제

3. 안드로이드 매니페스트에 리시버 등록
<receiver android:name="MyAppReceiver">
     <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
     </intent-filter>
</receiver>


[인텐트 실습-1]
1.MyIntentExam.java 수정: 버튼1을 누르면 다음과 같이 인텐트를 발생시킨다. 
1) 액션은 "abc" 2) 카테고리는 default 3) mime type은 없음

방법1) startActivity(new Intent("abc"));
방법2) Intent intent = new Intent("abc");
            startActivity(intent);

2. 매니페스트 수정:1의 조건으로 인텐트를 수신하도록 MyTextStyle에 인텐트 필터를 추가한다.
<intent-filter>
    <action android:name="abc" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

[인텐트 실습-2]

1. MyIntentExam.java 수정: 버튼2을 누르면 다음과 같이 인텐트를 발생시킨다
1) 액션은 "abc" 2) 카테고리는 default 3) mime type은 "abc/def"

Intent intent = new Intent("abc");
intent.setType("abc/def");
startActivity(intent);

2. 매니페스트수정: 3의 조건으로 인텐트를 수신하도록 MyEditText에 인텐트 필터를 추가한다.
<intent-filter>
    <action android:name="abc" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="abc/def" />
</intent-filter>


#실습 5일차

[과제] MyMp3List
1. MyMp3List 리스트 액티비티 생성 
: public class MyMp3List extends ListActivity

2. MyMp3List의 onCreate 에서 음악 데이터 추출
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = getContentResolver().query(uri, null, null, null, null);

3. 커서어댑터 연결
String[] col_arr = {MediaStore.Audio.Media.TITLE}; // 가져올 컬럼명
int[] view_id_arr = {android.R.id.text1}; // 바인딩할 텍스트 아이디

SimpleCursorAdapter adapter
= new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, col_arr, view_id_arr);
setListAdapter(adapter);

4. MP3 리스트의 아이템을 클릭하면 다음과 같이 인텐트를 발생 (onListItemClick)

Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);


[MyIntentCaller/ MyIntentReceiver 과제]
1. my_intent_caller.xml 에 Spinner 추가 (id는 sp) 

2. MyIntentCaller의 onCreate에서 Spinner는 다음의 데이터를 표시하도록 함
String[] items = {"book", "shop", "movie" };
final Spinner sp = (Spinner) findViewById(R.id.sp);
sp.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items));

3. MyIntentCaller에서 "인텐트호출"버튼 클릭핸들러에서 
    Spinner의 선택값을 "mychoice"라는 이름으로 MyIntentReceiver로 전송

    intent.putExtra("mychoice", sp.getSelectedItem().toString());

4. MyIntentReceiver에서 수신한 항목을 Toast로 표시

String choice = getIntent().getStringExtra("mychoice");
Toast.makeText(this, choice, 1000).show();


[환경설정 항목 2개 추가]
1. my_pref.xml에 다음 2개 항목을 추가

<CheckBoxPreference android:key="my_pref_ori"  android:title="항상 가로화면으로 봅니다." />
<EditTextPreference android:key="my_pref_title"   android:title="액티비티의 제목을 설정합니다." />

2. MyXMLPrefView.java (onCreate 함수 내에)

1)  키값이 my_pref_title, my_pref_ori인 항목값을 읽어오도록 로직 추가
String activity_title = sp.getString("my_pref_title", "액티비티 제목 없음");
boolean activity_ori = sp.getBoolean("my_pref_ori", false);

2) 액티비티에 적용
  setTitle(activity_title);  // 액티비티 타이틀 변경
  if(activity_ori) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
 // 화면 회전 처리 : 항상 가로로


[SD카드로 입출력] MyReadBin.java

1. 권한 추가 (AndroidManifest.xml)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2. onResume함수 수정
   1)  openFileInput부분은 주석처리
    // InputStream in = openFileInput(BIN_FILE_NAME); 
    
    2) 대신에 다음 2라인 추가
    File f = new File("/sdcard/okgosu.txt");
    InputStream in = new FileInputStream(f);

3. onPause함수 수정
   1) openFileOutput 부분은 주석 처리
   // OutputStreamWriter out = new OutputStreamWriter(openFileOutput(BIN_FILE_NAME, 0));

   2) 대신에 다음의 4라인 추가
   File f = new File("/sdcard/okgosu.txt");
   if(!f.exists()) f.createNewFile();
   OutputStream os = new FileOutputStream(f);
   OutputStreamWriter out = new OutputStreamWriter(os);


------------------------------------------------
상품조회 테이블 (prod)
-----------------------------------------
아이디    상품코드         상품명
_id         prod_code     prod_name
1            snk01             새우깡
2            snk02             맛동산
3            snk03             양파링....

[MyDBExam 수정, 삭제 처리]
1. 멤버변수 추가
String prod_id = null;

2. onListItemClick 오버라이딩하여 선택한 id값을 prod_id에 저장
prod_id = String.valueOf(id);

3. 선택한 로우 삭제
1) DB를 Write모드로 오픈: p58 "DB 접속 방법" 참조
2) 데이터 삭제
String whereClause = MyProdDBCons.PROD_ID+ "= ? ";
String[] whereArgs = {prod_id};
sdb.delete(MyProdDBCons.TABLE_NAME, whereClause, whereArgs);
sdb.close();
Toast.makeText(MyDBExam.this, "삭제되었습니다", 1000).show();

4. 선택한 로우 수정
1) DB를 Write모드로 오픈: p58 "DB 접속 방법" 참조
2) 데이터 수정
String whereClause = MyProdDBCons.PROD_ID+ "= ? ";
String[] whereArgs = {prod_id};
ContentValues values = new ContentValues();
values.put(MyProdDBCons.PROD_CODE, ed_prod_code.getText().toString());
values.put(MyProdDBCons.PROD_NAME, ed_prod_name.getText().toString());
sdb.update(MyProdDBCons.TABLE_NAME, values, whereClause, whereArgs);
sdb.close();
Toast.makeText(MyDBExam.this, "수정되었습니다", 1000).show();

[연락처 DB쿼리] MyContactManager ListActivity 생성

1. 매니페스트에 권한 추가
<uses-permission android:name="android.permission.READ_CONTACTS"/>

2. MyContactManager (ListActivity)의 onCreate에서

Cursor cursor = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

// 가져올 컬럼의 이름값 배열
String[] cols = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME};

// 컬럼을 매치시킬 View의 ID 배열
int[] view_ids = {android.R.id.text2, android.R.id.text1};

// Cursor 객체를 화면에 연결시켜주기 위한 Adapter생성
SimpleCursorAdapter adapter
= new SimpleCursorAdapter(this, 
android.R.layout.simple_list_item_2, cursor, cols, view_ids);

// Adapter를 ListView에 연결
setListAdapter(adapter);


[사진정보 쿼리]: MyAlbum ListActivity

1. onCreate 오버라이딩

Cursor c = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

// 가져올 컬럼의 이름값 배열
String[] cols = {Images.Media.TITLE};

// 컬럼을 매치시킬 View의 ID 배열
int[] view_ids = {android.R.id.text1};

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, c, cols, view_ids);

// 어댑터 설정
setListAdapter(adapter);

2. 리스트 클릭시 이미지 보이도록 onListItemClick 오버라이딩

Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);


[컨텐트 프로바이더 활용] MyCPDemo의 로직 설정
q
1. btn1을 클릭하면 DB데이터 건수 조회
Cursor c = getContentResolver().query(MyProdDBCons.CONTENT_URI, null, null, null, null);
Toast.makeText(MyCPDemo.this, "건수:" + c.getCount(), 1000).show();q

2. btn2를 클릭하면DB쿼리결과를ListView에보여줌

// select할 컬럼 목록
String columns[] = {MyProdDBCons.PROD_ID, MyProdDBCons.PROD_CODE};
// 커서 쿼리
Cursor c = getContentResolver().query(
                  MyProdDBCons.CONTENT_URI, columns, null, null, null);
// 가져올 컬럼의 이름값 배열
String[] cols = {MyProdDBCons.PROD_ID, MyProdDBCons.PROD_CODE};

// 컬럼을 매치시킬 View의 ID 배열
int[] view_ids = {android.R.id.text1, android.R.id.text2};

SimpleCursorAdapter adapter = new SimpleCursorAdapter(MyCPDemo.this,
    android.R.layout.simple_list_item_2, c, cols, view_ids);
setListAdapter(adapter);

3. btn3을 클릭하면 DB에 데이터 1건 입력
ContentValues values = new ContentValues();
values.put(MyProdDBCons.PROD_CODE, ed_prod_code.getText().toString());
values.put(MyProdDBCons.PROD_NAME, ed_prod_name.getText().toString());
getContentResolver().insert(MyProdDBCons.CONTENT_URI, values);q
Toast.makeText(MyCPDemo.this, "입력되었습니다", 1000).show();

4. 아이템 선택 이벤트 처리
1) 멤버변수 추가
String prod_id = null;

2) onListItemClick 오버라이딩하여 선택한 id값을 prod_id에 저장
prod_id = String.valueOf(id);

5. btn4를 클릭하면 DB에 데이터 1건 수정
   ContentValues values = new ContentValues();
   values.put(MyProdDBCons.PROD_CODE, ed_prod_code.getText().toString());
   values.put(MyProdDBCons.PROD_NAME, ed_prod_name.getText().toString());  
   String where = MyProdDBCons.PROD_ID+ "= ? ";
   String[] selectionArgs = {prod_id};
   getContentResolver().update(MyProdDBCons.CONTENT_URI, values, where, selectionArgs);
   Toast.makeText(MyCPDemo.this, "수정되었습니다", 1000).show();
q
6. btn5을 클릭하면 DB에 데이터 1건 삭제
   String where = MyProdDBCons.PROD_ID+ "= ? ";
   String[] selectionArgs = {prod_id};
   getContentResolver().delete(MyProdDBCons.CONTENT_URI, where, selectionArgs);
   Toast.makeText(MyCPDemo.this, "삭제되었습니다", 1000).show();

[MyCPDemo 수정] 커스텀 레이아웃 생성
: 현재 PROD_ID, PROD_CODE만 보이는데, 
PROD_ID, PROD_CODE, PROD_NAME도 같이 보이도록 커스텀 레이아웃을 설정한다.

1. ListView에서 사용할 행에 대한 레이아웃 생성: my_prod_row.xml

1) LinearLayout에 ImageView 1개, TextView 3개를 추가
2) 각각 id는 img, text1, text2, text3
3) ImageView의 src속성은 @drawable/icon으로 설정

4) text1 은 android:textColor="#FF0000" android:layout_width="20dp" android:layout_height="wrap_content" 
5) text2 은 android:textColor="#FFFF00" android:layout_width="50dp" android:layout_height="wrap_content" 
6) text3 은 android:layout_weight="1"

2. MyCPDemo의 조회 부분을 다음과 같이 변경

String columns[] = {MyProdDBCons.PROD_ID, MyProdDBCons.PROD_CODE, MyProdDBCons.PROD_NAME};
Cursor c = getContentResolver().query(
                  MyProdDBCons.CONTENT_URI, columns, null, null, null);
String[] cols = {MyProdDBCons.PROD_ID, MyProdDBCons.PROD_CODE, MyProdDBCons.PROD_NAME};
int[] view_ids = {R.id.text1, R.id.text2, R.id.text3};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(MyCPDemo.this,
    R.layout.my_prod_row, c, cols, view_ids);
setListAdapter(adapter);



[MyTaskList] 
1. MyTaskList.java 라는 ListActivity 작성
//멤버변수 선언
private ArrayList items = new ArrayList();
private List taskList;

2. onCreate함수 오버라이딩: 포그라운드 액티비티 정보들
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
taskList = activityManager.getRunningTasks(7);
Iterator itr = taskList.iterator();
while (itr.hasNext()) {
  RunningTaskInfo info = (RunningTaskInfo)itr.next();
  items.add(info.topActivity.getClassName()); // 클래스 이름
}
3. ArrayAdapter 생성 및 ListView에 설정
: 각자 알아서...

4. 퍼미션 추가 < uses-permission android:name="android.permission.GET_TASKS"/ > 

5. 항목을 클릭하면 앱을 강제 종료
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
   ActivityManager actMng = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
   RunningTaskInfo info =(RunningTaskInfo)taskList.get(position);
   String pname = info.topActivity.getPackageName();
   actMng.restartPackage(pname);// android 2.1
}

* 필요 권한 <uses-permission android:name="android.permission.RESTART_PACKAGES"/> 

[RSS리더] HttpClient 사용

0. 웹주소 확인
http://okgosu.net/zbxe/deveng/rss

1. 액티비티 작성 MyRSS - ListActivity

// 멤버변수 선언
ArrayList<String> items = new ArrayList<String>();

2. onCreate 오버라이딩 (DOM파싱이므로 dom.Element를 import)

HttpClient hc = new DefaultHttpClient();
HttpGet req = new HttpGet("http://okgosu.net/zbxe/deveng/rss");
try {
   ResponseHandler<String> res = new BasicResponseHandler();
   String resStr = hc.execute(req, res); // XML결과값
   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   Document doc = builder.parse(new InputSource( new StringReader(resStr)));
   NodeList nl = doc.getElementsByTagName("title");
   items.clear();
   for(int i=0; i<nl.getLength(); i++){
       Element el = (Element)nl.item(i);
       String data = (String)el.getFirstChild().getNodeValue(); // Node값
       items.add(data);
    }
    setListAdapter(new ArrayAdapter(this,  android.R.layout.simple_list_item_1, items));
} catch (Exception e) {
    e.printStackTrace();
}

// okgosu.net 블로그 새글 확인 로직
[새글 확인]
String uri = "http://okgosu.net/zbxe/deveng/rss"; // RSS 주소
HttpClient hc = new DefaultHttpClient();
HttpGet req = new HttpGet(uri);
try {
      ResponseHandler<String> resHandler = new BasicResponseHandler();
      String resStr  = hc.execute(req, resHandler);// RSS XML 리턴
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      Document doc = builder.parse(new InputSource( new StringReader(resStr)));
      NodeList list = doc.getElementsByTagName("item"); 
      for (int i = 0; i < list.getLength(); i++) {
          Element el = (Element) list.item(i);
          String data = el.getElementsByTagName("pubDate").item(0).getFirstChild().getNodeValue();
          Calendar checkDate = Calendar.getInstance(); 
          checkDate.set(2011, 2, 15);//2011.3.15
          Calendar itemDate = Calendar.getInstance();
          itemDate.setTime(new Date(Date.parse(data)));
          if(itemDate.after(checkDate)) {
         // 2011.3.15 이후의 새글 등록됨 
      res = true;
          }
     }
} catch (Exception e) {
   e.printStackTrace();
}

[MyMapView에 마커표시] mapControl.setZoom(15); 밑에

MapView.LayoutParams mapMarkerParams = new MapView.LayoutParams(
   LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
   newPoint, MapView.LayoutParams.TOP_LEFT );

ImageView mapMarker = new ImageView(getApplicationContext());
mapMarker.setImageResource(R.drawable.gmarker);
map.addView(mapMarker, mapMarkerParams);

[특정 인텐트에 대해 호출될 클래스 정보 미리 뽑기]
Intent intent = new Intent(Intent.ACTION_MAIN); 
// 호출조건
// 1) act: main
// 2) cat: default
// 3) mime: 없음
List<ResolveInfo> res = getPackageManager().queryIntentActivities(intent, 
   PackageManager.MATCH_DEFAULT_ONLY);
Iterator<ResolveInfo> itr = res.iterator();
while(itr.hasNext()) {
          ResolveInfo info = itr.next();
         String appName = info.activityInfo.name;
}

[수신 인텐트 정보] 각 액티비티의 onCreate에 다음 추가

Intent check = getIntent();
String act = check.getAction();//인텐트 액션
String mime = check.getType();// 인텐트 MIME
String pname = this.getPackageName(); // 현재 실행될 액티비티 패키지명
String cname  = this.getClass().getName(); // 현재 실행될 액티비티 클래스명
profile