res > 에 xml 폴더 생성후 -> preferences.xml을 생성




main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TableRow>
        <TextView
            android:paddingRight="5px"
            android:text="체크박스:" />

        <TextView android:id="@+id/checkbox" />
    </TableRow>

    <TableRow>
        <TextView
            android:paddingRight="5px"
            android:text="벨소리:" />

        <TextView android:id="@+id/ringtone" />
    </TableRow>

    <TableRow>
        <TextView
            android:paddingRight="5px"
            android:text="체크박스 #2:" />

        <TextView android:id="@+id/checkbox2" />
    </TableRow>

</TableLayout>
preferences.xml
<PreferenceScreen
	xmlns:android="http://schemas.android.com/apk/res/android">
	<PreferenceCategory android:title="Simple Preferences">
		<CheckBoxPreference
			android:key="@string/checkbox"
			android:title="체크박스 환경설정"
			android:summary="체크 상태를 변경합니다"
		/>
		<RingtonePreference
			android:key="@string/ringtone"
			android:title="벨소리 환경설정"
			android:showDefault="true"
			android:showSilent="true"
			android:summary="벨소리를 선택합니다"
		/>
	</PreferenceCategory>
	<PreferenceCategory android:title="상세 화면">
		<PreferenceScreen
			android:key="detail"
			android:title="상세 화면"
			android:summary="별도 페이지에 상세 설정이 있습니다">
			<CheckBoxPreference
				android:key="@string/checkbox2"
				android:title="상세 체크박스"
				android:summary="체크 상태를 변경합니다"
			/>
		</PreferenceScreen>
	</PreferenceCategory>
</PreferenceScreen>


main javafile
package com.commonsware.android.prefs;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class StructuredPrefsDemo extends Activity {
	private static final int EDIT_ID =1; 
	private static final int CLOSE_ID =2;

	private TextView checkbox = null;
	private TextView ringtone = null;
	private TextView checkbox2 = null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		checkbox = (TextView)findViewById(R.id.checkbox);
		ringtone = (TextView)findViewById(R.id.ringtone);
		checkbox2 = (TextView)findViewById(R.id.checkbox2);
	}
	@Override
	public void onResume(){
		super.onResume();
		
		//환경설정시 생성된 default 환경설정 파일을 읽어들여 SharedPreference 객체 생성
		SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

		//환경설정 파일에서 저장된 정보의 타입별로 메소드를 호출해 정보를 추출함
		//getBoolean(key,기본값)
		//				  기본값 : key를 통해서  value를 호출하게 되는데
		//					         설정된 값이 없을때 보여지는 값
		checkbox.setText(new Boolean(prefs.getBoolean("checkbox",false)).toString());
		ringtone.setText(prefs.getString("ringtone","<unset>"));
		checkbox2.setText(new Boolean(prefs.getBoolean("checkbox2",false)).toString());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu){
		menu.add(Menu.NONE, EDIT_ID, Menu.NONE, "환경 설정")
		.setIcon(R.drawable.misc);
		menu.add(Menu.NONE, CLOSE_ID, Menu.NONE, "닫기")
		.setIcon(R.drawable.eject);

		return(super.onCreateOptionsMenu(menu));
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item){
		switch(item.getItemId()){
		case EDIT_ID:
			startActivity(new Intent(this,EditPreferences.class));
			return true;
		case CLOSE_ID:
			finish();
			return true;
		}
		return(super.onOptionsItemSelected(item));
	}
}
sub javafile
package com.commonsware.android.prefs;

import android.preference.PreferenceActivity;
import android.os.Bundle;

public class EditPreferences extends PreferenceActivity{
	@Override
	public void onCreate(Bundle savedIstanceState){
		super.onCreate(savedIstanceState);
		
		addPreferencesFromResource(R.xml.preferences);
	}
}

메인에는 환경설정값을 가져옵니다 (없을시에는 기본값 지정)

환경설정 진입화면



상세화면 진입화면



인터넷 권한 설정



main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/mainTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#CCCCCC"
        android:paddingBottom="5px"
        android:paddingTop="5px"
        android:textColor="#000000"
        android:textSize="13sp" />

    <TextView
        android:id="@+id/mainDescription"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#CCCCCC"
        android:paddingBottom="5px"
        android:textColor="#000000"
        android:textSize="12sp" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#FFFFFF"/>

</LinearLayout>


news_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>    
	<WebView
	    android:id="@+id/web"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    /> 
</LinearLayout>


news_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" 
	android:layout_height="50px"
	android:padding="5px"> 
	<TextView 
	    android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:id="@+id/text"
		android:textColor="#000000" 
		android:textSize="15sp"
	    /> 
</LinearLayout>


main javafile
  
 package kr.android.news;

import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class NewsRssDemo extends ListActivity {
	ArrayList<MyNews> myRss = new ArrayList<MyNews>();
	MyNews myRssProv = new MyNews();
	TextView mainTitle, mainDescription;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		parseXml();
		setListAdapter(new MyListAdapter(this, R.layout.news_list));

		mainTitle = (TextView)findViewById(R.id.mainTitle);
		mainDescription = (TextView)findViewById(R.id.mainDescription);

		mainTitle.setText(myRssProv.title);
		mainDescription.setText(myRssProv.description);
	}
	private void parseXml(){
		InputStream in = null;

		try{
			URL url = new URL("http://www.hani.co.kr/rss/");
			in = url.openStream();

			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

			//태크 사이의 공백무(JDK6.0이상부터 오류)
			factory.setIgnoringElementContentWhitespace(true);
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(in);

			//신문사 정보 추출/저장
			Node provider = doc.getElementsByTagName("channel").item(0);

			NodeList prov = provider.getChildNodes();
			for(int j=0; j<prov.getLength();j++){
				Node n = prov.item(j);
				if(n.getNodeName().equals("title")){
					myRssProv.title =n.getFirstChild().getNodeValue();
				}
				if(n.getNodeName().equals("link")){
					myRssProv.link = n.getFirstChild().getNodeValue();
				}
				if(n.getNodeName().equals("description")){
					myRssProv.description = n.getFirstChild().getNodeValue();
					break;
				}
			}
			//기사 추출 & 저장
			NodeList articles = doc.getElementsByTagName("item");

			for(int i=0; i<articles.getLength(); i++){
				MyNews myNews = new MyNews();
				NodeList article = articles.item(i).getChildNodes();
				for(int j=0;j<article.getLength();j++){
					Node n = article.item(j);
					if(n.getNodeName().equals("title")){
						myNews.title = n.getFirstChild().getNodeValue();
					}
					if(n.getNodeName().equals("link")){
						myNews.link = n.getFirstChild().getNodeValue();
					}
					if(n.getNodeName().equals("description")){
						myNews.description = n.getFirstChild().getNodeValue();
					}
				}
				myRss.add(myNews);
			}
		}catch (Exception e){
			e.printStackTrace();
			Toast.makeText(this, "주소 읽기 실패"+e.getMessage(),
					Toast.LENGTH_SHORT).show();
		}finally{
			try{
				if(in != null) in.close();
			}catch(Exception e){

			}
		}
	}
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id){
		super.onListItemClick(l, v, position, id);
		Intent intent = new Intent(this, NewsRssDetail.class);
		
		intent.putExtra("title", myRss.get(position).title);
		intent.putExtra("link", myRss.get(position).link);
		intent.putExtra("description", myRss.get(position).description);
		
		startActivity(intent);
	}
	//어댑터 클래스
	class MyListAdapter extends BaseAdapter {
		Context context;
		LayoutInflater inflater;
		int layout;
		
		public MyListAdapter(Context context,int layout){
			this.context = context;
			this.layout = layout;
			
			//ListView에서 사용한 View를 정의한 xml를 읽어오기 위해
			//LayoutInflater 객체를 생성
			inflater = LayoutInflater.from(context);
		}
		public int getCount() {
			return myRss.size();
		}
		public Object getItem(int position) {
			return myRss.get(position).title;
		}
		public long getItemId(int position) {
			return position;
		}
		public View getView(int position, View convertView, ViewGroup parent) {
			if(convertView == null){
				convertView = inflater.inflate(layout,parent,false);
			}
			TextView txt = (TextView)convertView.findViewById(R.id.text);
			txt.setText(myRss.get(position).title);
			
			return convertView;
		}
	}

	class MyNews{
		String title;
		String link;
		String description;
	}
}


sub javafile
package kr.android.news.rss;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;

public class NewsRssdetail extends Activity  {
    
    String title ,link,description;
    WebView web;
    
    protected void onCreate(Bundle save){
        super.onCreate(save);
        setContentView(R.layout.news_detail);
        
        Intent intent = getIntent();
        
        title = intent.getExtras().getString("title");
        link = intent.getExtras().getString("link");
        description = intent.getExtras().getString("description");
        
        
        StringBuffer text =new StringBuffer();
        text.append("<html><body><font size=\"4\">");
        text.append(title);
        text.append("</font><hr size=\"2\" width=\"100%\" noshade>");
        text.append("<font size=\"2\">");
        text.append(description);
        text.append("</font><br/>");
        text.append("<div align=\"center\"><input type=\"button\" value=\"기사 전문 보기\" onclick=\"location.href='");
        text.append(link);
        text.append("'\"></div>");
        text.append("</body></html>");
        
        web= (WebView)findViewById(R.id.web);
        WebSettings set = web.getSettings();
        set.setJavaScriptEnabled(true);
        set.setBuiltInZoomControls(true);
        web.loadDataWithBaseURL(null, text.toString(), "text/html", "UTF-8", null);
    }
}



maifest.xml에서 권한설정을 해줍니다

(uses permission)



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <WebView
            android:id="@+id/web"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

        <ProgressBar
            android:id="@+id/web_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:visibility="gone" />
    </FrameLayout>

</LinearLayout>


package kr.android.web.progressbar;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

public class ProgressBarDemo1 extends Activity {
	private WebView web;
	private ProgressBar progress;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ConnectivityManager cm = 
				(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		boolean isWifiConn = ni.isConnected();

		ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

		boolean isMobileConn = ni.isConnected();

		if (!isWifiConn && !isMobileConn) {
			Toast.makeText(this, "인터넷에 접속되어 있지 않습니다!", Toast.LENGTH_SHORT)
			.show();
			finish();//액티비티 종료
		} else {
			setContentView(R.layout.main);

			progress = (ProgressBar) findViewById(R.id.web_progress);

			web = (WebView) findViewById(R.id.web);
			web.getSettings().setJavaScriptEnabled(true);
			web.getSettings().setBuiltInZoomControls(true);
			web.setHorizontalScrollbarOverlay(true);
			web.setVerticalScrollbarOverlay(true);

			web.loadUrl("http://raysoda.com");

			web.setWebViewClient(new WebViewClient() {
				// 링크 클릭에 대한 반응
				@Override
				public boolean shouldOverrideUrlLoading(WebView view, String url) {
					view.loadUrl(url);
					return true;
				}

				// 웹페이지 호출시 오류 발생에 대한 처리
				@Override
				public void onReceivedError(WebView view, int errorcode,
						String description, String fallingUrl) {
					Toast.makeText(ProgressBarDemo1.this,
							"오류 : " + description, Toast.LENGTH_SHORT).show();
				}
				// 페이지 로딩 시작시 호출
				@Override
				public void onPageStarted(WebView view,String url , Bitmap favicon){
					progress.setVisibility(View.VISIBLE);
				}
				//페이지 로딩 종료시 호출
				public void onPageFinished(WebView view,String Url){
					progress.setVisibility(View.GONE);
				}
			});
		}
	}
	public boolean onKeyDown(int keyCode, KeyEvent event){
		if(keyCode ==KeyEvent.KEYCODE_BACK && web.canGoBack()){
			web.goBack();
		}else if(keyCode ==KeyEvent.KEYCODE_BACK && !web.canGoBack()){
			Toast.makeText(this, "프로그램 종료!!", Toast.LENGTH_SHORT).show();
			finish();
		}
		return true;
	}
}
실행화면


무언가를 읽어들이는 것에는 무조건 Progress가 뜹니다






두번째 타이틀에 로딩바심기(ProgressBar)


인터넷 권한 설정 해주기




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/web"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>


package kr.android.web.progressbar2;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class ProgressBarDemo2 extends Activity {
	private WebView web;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 타이틀바에 막대모양 프로세스 setContentView();
		// 호출 전에 호출 해야함
		getWindow().requestFeature(Window.FEATURE_PROGRESS);

		setContentView(R.layout.main);

		web = (WebView) findViewById(R.id.web);
		web.getSettings().setJavaScriptEnabled(true);
		web.getSettings().setBuiltInZoomControls(true);

		web.loadUrl("http://m.naver.com");

		final Activity activity = this;
		web.setWebChromeClient(new WebChromeClient() {
			public void onProgressChanged(WebView view, int progress) {
				// progress 구간 0~10000
				activity.setProgress(progress * 100);
				Log.i("progressBarDemo2", "Progress :" + progress);
			}
		});
		web.setWebViewClient(new WebViewClient() {
			@Override
			public void onReceivedError(WebView view, int errorCode,
					String description, String fallingUrl) {
				Toast.makeText(activity, "오류 : " + description,
						Toast.LENGTH_SHORT).show();
			}

			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				view.loadUrl(url);
				return true;
			}
		});
	}
	public boolean onKeyDown(int keyCode, KeyEvent event){
		if(keyCode ==KeyEvent.KEYCODE_BACK && web.canGoBack()){
			web.goBack();
		}else if(keyCode ==KeyEvent.KEYCODE_BACK && !web.canGoBack()){
			Toast.makeText(this, "프로그램 종료!!", Toast.LENGTH_SHORT).show();
			finish();
		}
		return true;
	}
}



private boolean isRunningService(){
		ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
		List<ActivityManager.RunningServiceInfo> rsi = 
				manager.getRunningServices(100);
		for(int i=0; i<rsi.size();i++){
			ActivityManager.RunningServiceInfo rsInfo = rsi.get(i);
			if(rsInfo.service.getClassName().equals(
					"kr.android.news.service.NewsService")){
				Log.i("NewsDemo","~~~~~~실행중"+rsInfo.service.getClassName());
				return true;
			}
		}
		return false;
	}


'Android > 기본' 카테고리의 다른 글

RSS 가져오기(뉴스)  (0) 2012.04.28
Progressbar로 로딩표현 (인터넷로딩)  (1) 2012.04.28
안드로이드 프로세스 말끔히 죽이기  (0) 2012.04.28
Xml 가져오기 (날씨)  (0) 2012.04.28
SQLite 연동하기  (1) 2012.04.28

Android How to Kill Application Process 
관련글: 안드로이드 어플리케이션 종료하기 (이글을 참조하시기 바랍니다.)

<개발자의 부주의로 어플리케이션이 정리되지 않는 설겆이 거리를 만들어 낼 수 있습니다..>

  안드로이드 상에서 어플리케이션 개발을 진행하다 보면, 어플리케이션 Process 자체를 종료 시키고 싶은 경우가 있습니다. 특히 제 경우에는 여러가지 핸들러나 스레드를 사용하는 경우 Process 를 종료시키고 싶을 때가 많더군요. Activity 를 모두 종료하더라도, Process 가 살아 있으면 메인 UI 스레드에 연결되어 있는 Handler 와 Message 는 쌩쌩히 동작합니다. 더군다나 시간이 오래 걸리는 작업을 수행하기 위해 Thread 를 여럿 생성해 둔 상태에서 해당 Thread 들의 라이프 사이클을 잘 관리하지 않으면 Activity 가 종료 되더라도, 죽지 않고 계속 살아 남기 때문에, 원인을 알 수 없는 오류로 어플리케이션을 죽여 먹곤 했습니다. 

  그야말로 고생해서 밥 잘 해먹은 다음에, 설겆이 하면서 그릇을 다 깨먹는 형국입니다. 성능상에 약간의 손실을 감수하더라도, 기름때가 잔뜩 묻은 접시마냥 흉칙하게 남아있는 깔끔하게 정리해 버리고자, 몇 가지 방법을 사용해봤습니다. 하지만,종료 버튼 관련 포스트에서 한번 언급했듯이, 그런 시도들이 썩 성공적이지는 않았습니다.

 
<드라큘라에게도 약점이 있듯이, 안드로이드 Process 도 죽이는 방법이 있습니다.>

  궁하면 통하는 법인가요? 얼마전에 훌륭하게 Process 를 종료시킬 수 있는 방법을 구글링을 통해 발견해서 이야기해 봅니다. 특정 어플리케이션의 Process 를 확실히 죽이는 방법은 다음과 같습니다.
1.메니페스트 파일에 RESTART_PACKAGES 권한을 사용한다고 선언한다.
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>

2.ActivityManager 의 restartPackage API 를 호출한다.
ActivityManager am 
             = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
 이전에는 System.exit() 나 Process.killProcess() 를 이용해서 Process 를 종료하려고 했습니다. 두 가지 방법 모두, Process 를 정상적으로 종료 시키는 듯 보일 때도 있었지만, 대게의 경우 어플리케이션 Process 가 죽었나... 하는 순간에 벌떡 하고 무덤에서 살아 돌아와 저를 우울하게 만들고 했습니다.

 어떠한 차이때문에 이런 일이 벌어지는 걸 까요? 안드로이드 Process의 생명 주기에 대해 다시 한번 확인해 봤습니다.  안드로이드 Application Fundamentals 에 명시되어 있는 내용은 다음과 같습니다. 

Android may decide to shut down a process at some point, when memory is low and required by other processes that are more immediately serving the user. Application components running in the process are consequently destroyed. A process is restarted for those components when there's again work for them to do.

 System.exit() 이나 Process.killProcess() 를 호출 하면, Process 가 강제로 종료되고, 안드로이드 플랫폼 입장에서는, 예기치않은 이유로 해당 Process 가 종료되었다고 판단하는 것으로 보입니다. 이 때, 해당 Process 가 해야할 일이 남아 있은 경우, 안드로이드 플랫폼 입장에서 이미 무덤에 돌아간 Process 를 다시 불러 일으키게 됩니다. 제가 알고있는 경우는 두 가지 입니다.
  •  START_NOT_STICKY 모드가 아닌 Service 가 작동 중인 경우.
  •  Activity Task 상에 현재 화면에 보이는 Activity 바로 아래 위치한 Activity 가 종료하고자 하는 Process 의 구성 요소 일 때. (Task 는 Process 가 아니라 안드로이드 시스템에서 관리하고 있음으로, 갑자기 종료된 Activity 바로 아래에 위치한 Activity 를 시스템에서 다시 시작하려고 함으로...) 
 그럼, restartPackage() 의 경우에는 어째서 Process 가 다시 살아나지 않는 것일까요? 그 답은 API 문서에 잘 나와 있습니다. 

public void restartPackage (String packageName)

Since: API Level 3

Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.


 API 설명에 잘 나와 있듯이, restartPackage() 의 경우, 단지 Process 를 종료하는 것이 아니라, 안드로이드 플랫폼에게 특정 어플리케이션 패키지가 종료됨을 알리고, 따라서 이미 실행중인 Service 나 Activity 를 안드로이드 시스템상에서 모두 제거하게 됩니다. 

<편히 잠들기를...>


 안드로이드 플랫폼은 우리가 알게 모르게 많은 일들을 수행하고 있습니다. 그렇기 때문에, 안드로이드 플랫폼에게 Process 가 죽었다는 사실을 알려준 후에야, 묻어놓은 개발자들은 시체가 무덤에서 다시 돌아오지 않을 것임을 확신하고 마음 편히 잠들 수 있습니다...



출처:http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110082677696

인터넷 권한 있어야 합니다 manifest.xml -> permission -> INTERNET



<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webkit"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />


package kr.android.weather;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import android.webkit.WebView;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class WeatherDemo extends Activity {
	//기상청 날씨정보
	private static final String WEATHER_URL 
	="http://www.kma.go.kr/XML/weather/sfc_web_map.xml";
	private WebView browser;
	private List<Forecast> forecasts = new ArrayList<Forecast>();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		browser=(WebView)findViewById(R.id.webkit);
		updateForecast();       
	}

	private void updateForecast(){
		buildForecastsByXmlPullParser(getStreamFromUrl());

		String page=generatePage();

		/*        loadDataWithBaseURL (
        String baseUrl:기본페이지, 
        String data,  
        String mimeType, 
        String encoding, 
        String historyUrl :에러시 돌아갈 페이지)
		 */
		browser.loadDataWithBaseURL(null,page,"text/html","UTF-8",null);
	}

	private InputStream getStreamFromUrl(){
		InputStream input=null;

		try{
			HttpClient client = new DefaultHttpClient();
			HttpGet getMethod =new HttpGet(WEATHER_URL);
			//응답을 받을 객체
			HttpResponse response =(HttpResponse)client.execute(getMethod);
			//응탑 수신 처리
			HttpEntity entity =response.getEntity();
			BufferedHttpEntity buf=new BufferedHttpEntity(entity);
			input =buf.getContent();
		}
		catch (Exception e){
			Log.e("WeatherDemo","Exception fetching data",e);
			Toast.makeText(this, "요청실패: "+e.toString(), 4000).show();
		}
		return input;
	}

	public void buildForecastsByXmlPullParser(InputStream input){
		String desc =null;
		String temp =null;
		String locale =null;
		try{
			XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
			XmlPullParser parser = factory.newPullParser();
			//파서에 스트림 연결 (default = "UTF-8")
			parser.setInput(input, null);

			while(parser.getEventType()!=XmlPullParser.END_DOCUMENT){

				if(parser.getEventType()==XmlPullParser.START_TAG){
					if(parser.getName().equals("local")){
						//날씨처리 //3번째 속성 (0,1,2,3,4)
						desc =parser.getAttributeValue(2);
						//온도 처리 
						temp=parser.getAttributeValue(3);
					}
				}else if(parser.getEventType()==XmlPullParser.TEXT){
					//지역정보 처리
					locale =parser.getText();
				}else if (parser.getEventType()==XmlPullParser.END_TAG){
					forecasts.add(new Forecast(locale,desc,temp));
				}
				//XML의 파서 커서를 다음 태그로 이동시킴
				parser.next();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}      

	public String generatePage() {
		//StringBuilder : StringBuffer 와 차이점은 StringBuilder는 동기화를 지원한다
		StringBuilder bufResult=new StringBuilder("<html><body><table width=\"100%\">");

		bufResult.append("<tr><th width=\"30%\">지역</th>"+
				"<th width=\"50%\">날씨</th><th width=\"20%\">온도</th></tr>");

		//확장 for문 
		for (Forecast forecast : forecasts) {
			bufResult.append("<tr><td align=\"center\">");
			bufResult.append(forecast.locale);
			bufResult.append("</td><td align=\"center\">");
			bufResult.append(forecast.desc);
			bufResult.append("</td><td>");
			bufResult.append(forecast.temp);
			bufResult.append("</td></tr>");
		}

		bufResult.append("</table></body></html>");

		//StringBuilder를 String으로 넘겨줌
		return(bufResult.toString());
	}

	class Forecast {
		String locale;
		String desc;
		String temp;

		public Forecast(String locale,String desc,String temp){
			this.locale = locale;
			this.desc = desc;
			this.temp = temp;
		}
	}
}



src/ kr.android.sqlite / SQListDemo
package kr.android.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseAdapter {
	/*=-=-=-=-=-=-=-=-상수 정의 시작=-=-=-=-=-=-=-=-*/
	//Log 처리를 위한 TAG지정
	static final String TAG = "DatabaseHandler";
	//데이터 베이스 파일이름
	static final String DB_NAME ="daily_memo.db";
	//테이블 이름
	static final String TABLE_NAME="daily_memo";
	//데이터베이스 각열의 이름
	static final String MEMO_ID="_id";
	static final String MEMO_CONTENT="content";
	//컬럼 인덱스
	static final int ID_INDEX= 0;
	static final int CONTENT_INDEX =1;
	//컬럼 명세
	static final String[] PROJECTION = new String[] {MEMO_ID,MEMO_CONTENT};
	//테이블 생성 SQL
	static final String CREATE_TABLE ="CREATE table "+TABLE_NAME+" ("+MEMO_ID+" " +
			"integer primary key autoincrement, "+MEMO_CONTENT+" text not null);";
	//테이블 삭제 SQL
	static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME+";";
	/*=-=-=-=-=-=-=-=-상수 정의 끝=-=-=-=-=-=-=-=-*/

	//데이터 베이스 연동 객체
	private SQLiteDatabase db;
	//데이터 베이스를 이용하는 어플리케이션의 컨텍스트
	private Context context;

	public DatabaseAdapter(Context context){
		this.context=context;
	}

	//SQLiteDatabase 생성
	public void open() throws SQLException{
		try{
			db =(new DatabaseHelper(context)).getWritableDatabase();
		}catch(SQLiteException e){
			db =(new DatabaseHelper(context)).getReadableDatabase();
		}
	}

	//SQLiteDatabase 자원정리
	public void Close(){
		db.close();
	}

	//전체 행을 ID의 내림차순으로 호출
	public Cursor fetchAllMemo(){
		return db.query(TABLE_NAME, //테이블명
				PROJECTION, //컬럼명세
				null,		//where 절
				null,		//where 절에 전달될 데이터
				null,		//group by
				null,		//having
				MEMO_ID + " DESC " //order by
				);
	}
	//업데이트
	public void setMemo(String id, String content){

		//업데이트 값 설정
		ContentValues values = new ContentValues();
		//데이터 등록(컬럼명 , 수정할 데이터)
		values.put(MEMO_CONTENT, content);

		//행을 업데이트
		db.update(TABLE_NAME,	//테이블 명
				values,			//수정할 데이터
				MEMO_ID + " = ?",	//where절
				new String[]{ id }	//where절 ?에 전달될 primary key
				);
	}
	//검색
	public String searchMemo(String str){
		//읽을 데이터의 조건
		String where = MEMO_CONTENT+" like ?";
		//where의 ?을 대체할 매개 변수
		String param = str.substring(0,1) + "%";

		//검색
		Cursor c = db.query(
				TABLE_NAME,
				PROJECTION,
				where,	//WHERE
				new String[] { param },	//LIKE
				null,	//GROUP BY
				null,	//HAVING
				MEMO_ID+ " DESC",	//ORDERED BY 새로운 정렬
				"10");	//LIMIT 최대 10개

		StringBuffer buff = new StringBuffer();
		if(c.moveToFirst()){
			//검색 결과를 차례로 꺼내 문자열에 추가
			do{
				long id = c. getLong(ID_INDEX);
				buff.append("id(").append(id).append(") ");

				String memo = c.getString(CONTENT_INDEX);
				buff.append(memo).append("\n");
			}while(c.moveToNext());
		}
		c.close();
		return buff.toString();
	}

	//데이터를 추가하고 추가된 데이터의 primary key(_id)반환
	public String addMemo(String content){
		ContentValues values = new ContentValues();
		values.put(MEMO_CONTENT,  content);
		long id =db.insert(TABLE_NAME, MEMO_CONTENT, values);
		if(id < 0){
			return "";
		}
		return Long.toString(id);
	}

	//지정된 ID의 행삭제
	public void deleteMemo(String id){
		db.delete(TABLE_NAME, //테이블명
				MEMO_ID + " = ?", //where절
				new String[] { id } //where절 ? 에 전달될 데이터
				);
	}

	/*=-=-=--=-=-=-=-=-=SQLiteOPenHelper를 상속받아 구현한 클래스=-=-=-=-=-=-=-=-*/

	public class DatabaseHelper extends SQLiteOpenHelper{

		public DatabaseHelper(Context context){
			super(context, DB_NAME, null, 1);
		}

		//데이터 베이스를 새로 만든 다음 호출
		public void onCreate(SQLiteDatabase db){
			//내부에 테이블 만들기
			db.execSQL(CREATE_TABLE);
		}
		//존재하는 데이터 베이스로 정의하고 있는 버전이 다를때 super(context, DB_NAME, null, 1); -> 2
		public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
			Log.w(TAG,"Version mismatch : "+oldVersion+" to "+newVersion);
			//여기에서는 테이블을 삭제하고 새로 작성함
			//일반적으로 테이블의 데이터 변환을 수행
			db.execSQL(DROP_TABLE);
			onCreate(db);
		}
	}
}


src/ kr.android.sqlite / DatabaseAdapter
package kr.android.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseAdapter {
	/*=-=-=-=-=-=-=-=-상수 정의 시작=-=-=-=-=-=-=-=-*/
	//Log 처리를 위한 TAG지정
	static final String TAG = "DatabaseHandler";
	//데이터 베이스 파일이름
	static final String DB_NAME ="daily_memo.db";
	//테이블 이름
	static final String TABLE_NAME="daily_memo";
	//데이터베이스 각열의 이름
	static final String MEMO_ID="_id";
	static final String MEMO_CONTENT="content";
	//컬럼 인덱스
	static final int ID_INDEX= 0;
	static final int CONTENT_INDEX =1;
	//컬럼 명세
	static final String[] PROJECTION = new String[] {MEMO_ID,MEMO_CONTENT};
	//테이블 생성 SQL
	static final String CREATE_TABLE ="CREATE table "+TABLE_NAME+" ("+MEMO_ID+" " +
			"integer primary key autoincrement, "+MEMO_CONTENT+" text not null);";
	//테이블 삭제 SQL
	static final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME+";";
	/*=-=-=-=-=-=-=-=-상수 정의 끝=-=-=-=-=-=-=-=-*/

	//데이터 베이스 연동 객체
	private SQLiteDatabase db;
	//데이터 베이스를 이용하는 어플리케이션의 컨텍스트
	private Context context;

	public DatabaseAdapter(Context context){
		this.context=context;
	}

	//SQLiteDatabase 생성
	public void open() throws SQLException{
		try{
			db =(new DatabaseHelper(context)).getWritableDatabase();
		}catch(SQLiteException e){
			db =(new DatabaseHelper(context)).getReadableDatabase();
		}
	}

	//SQLiteDatabase 자원정리
	public void Close(){
		db.close();
	}

	//전체 행을 ID의 내림차순으로 호출
	public Cursor fetchAllMemo(){
		return db.query(TABLE_NAME, //테이블명
				PROJECTION, //컬럼명세
				null,		//where 절
				null,		//where 절에 전달될 데이터
				null,		//group by
				null,		//having
				MEMO_ID + " DESC " //order by
				);
	}
	//업데이트
	public void setMemo(String id, String content){

		//업데이트 값 설정
		ContentValues values = new ContentValues();
		//데이터 등록(컬럼명 , 수정할 데이터)
		values.put(MEMO_CONTENT, content);

		//행을 업데이트
		db.update(TABLE_NAME,	//테이블 명
				values,			//수정할 데이터
				MEMO_ID + " = ?",	//where절
				new String[]{ id }	//where절 ?에 전달될 primary key
				);
	}
	//검색
	public String searchMemo(String str){
		//읽을 데이터의 조건
		String where = MEMO_CONTENT+" like ?";
		//where의 ?을 대체할 매개 변수
		String param = str.substring(0,1) + "%";

		//검색
		Cursor c = db.query(
				TABLE_NAME,
				PROJECTION,
				where,	//WHERE
				new String[] { param },	//LIKE
				null,	//GROUP BY
				null,	//HAVING
				MEMO_ID+ " DESC",	//ORDERED BY 새로운 정렬
				"10");	//LIMIT 최대 10개

		StringBuffer buff = new StringBuffer();
		if(c.moveToFirst()){
			//검색 결과를 차례로 꺼내 문자열에 추가
			do{
				long id = c. getLong(ID_INDEX);
				buff.append("id(").append(id).append(") ");

				String memo = c.getString(CONTENT_INDEX);
				buff.append(memo).append("\n");
			}while(c.moveToNext());
		}
		c.close();
		return buff.toString();
	}

	//데이터를 추가하고 추가된 데이터의 primary key(_id)반환
	public String addMemo(String content){
		ContentValues values = new ContentValues();
		values.put(MEMO_CONTENT,  content);
		long id =db.insert(TABLE_NAME, MEMO_CONTENT, values);
		if(id < 0){
			return "";
		}
		return Long.toString(id);
	}

	//지정된 ID의 행삭제
	public void deleteMemo(String id){
		db.delete(TABLE_NAME, //테이블명
				MEMO_ID + " = ?", //where절
				new String[] { id } //where절 ? 에 전달될 데이터
				);
	}

	/*=-=-=--=-=-=-=-=-=SQLiteOPenHelper를 상속받아 구현한 클래스=-=-=-=-=-=-=-=-*/

	public class DatabaseHelper extends SQLiteOpenHelper{

		public DatabaseHelper(Context context){
			super(context, DB_NAME, null, 1);
		}

		//데이터 베이스를 새로 만든 다음 호출
		public void onCreate(SQLiteDatabase db){
			//내부에 테이블 만들기
			db.execSQL(CREATE_TABLE);
		}
		//존재하는 데이터 베이스로 정의하고 있는 버전이 다를때 super(context, DB_NAME, null, 1); -> 2
		public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
			Log.w(TAG,"Version mismatch : "+oldVersion+" to "+newVersion);
			//여기에서는 테이블을 삭제하고 새로 작성함
			//일반적으로 테이블의 데이터 변환을 수행
			db.execSQL(DROP_TABLE);
			onCreate(db);
		}
	}
}

res / values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, SQLiteDemo!</string>
    <!-- 응용 프로그램 이름 -->
    <string name="app_name">SQLiteDemo</string>

<!-- 등록된 메모가없는 경우에 대한 설명 -->
<string name="no_memo">메모가없습니다</string>

<!-- 버튼의 표시 문자열 -->
<string name="delete_label">삭제</string>
<string name="modify_label">변경</string>
<string name="add_label">추가</string>

<!-- ID 편집 텍스트 상자에 표시되는 팁 -->
<string name="id_label">ID</string>

</resources>


res/ layout/ main.xml 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <!-- ID 문자열 표시(수정/삭제시 해당 primary key 표시) -->
        <TextView
            android:id="@+id/view_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="@string/id_label"
            android:width="50dp" />

        <!-- 데이터 입력 (등록/수정/삭제) -->

        <EditText
            android:id="@+id/edit_memo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
                        
            />
    </LinearLayout>
    <!-- 등록/수정 삭제 버튼 -->

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/delete_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/delete_label" />

        <Button
            android:id="@+id/modify_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/modify_label" />

        <Button
            android:id="@+id/add_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/add_label" />
    </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:choiceMode="singleChoice" />
    <!-- ListView에 표시할 데이터가 없을 때 아래 위젯이 보여짐 -->
    <TextView
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_memo" />

</LinearLayout>


res/ layout/ memo_row.xml 
<?xml version="1.0" encoding="utf-8"?>
<!-- memo_row.xml -->
<!-- 목록보기 1 줄에 배치 -->
<LinearLayout

   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="horizontal"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
  <!-- ID가 표시되는 텍스트 뷰 -->
  <TextView
     android:id="@+id/_id"
     android:layout_width="50dp" 
     android:layout_height="wrap_content" />
  <!-- 메모보기 텍스트 뷰 -->
  <TextView
     android:id="@+id/memo_text"
     android:padding="5px"
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" />
</LinearLayout>




db파일 생성 여부 확인방법은


DDMS 진입후


data > data > 자신의 패키지명 > databases > 파일 저장 해서 보려면은 바로 이 이미지 위에 디스켓 모양이 있는데 파일 선택후 그것을 클릭하면 됩니다.










터치 밀어내서 화면 전환 입니다(스마트폰 배경화면 화면이랑 비슷)






첨부파일 (구글에서 배포하는 파일)


files.zip



 

xml파일은 res 폴더에 anim 폴더 생성후 파일을 붙여넣기 하면 됩니다


이미지 파일은 보는 폴더와 같이 하면 됩니다



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewFlipper
        android:id="@+id/flipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>


package kr.android.flipper.touch;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class FlipperTouch extends Activity implements View.OnTouchListener {
	ViewFlipper flipper;

	// 터치 이벤트 발생 지점의 x좌표 저장
	float down_x;
	float up_x;
	int[] imageItems;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		imageItems = new int[] { R.drawable.image01, R.drawable.image02,
				R.drawable.image03 };
		flipper = (ViewFlipper) findViewById(R.id.flipper);

		for (int i : imageItems) {
			ImageView image = new ImageView(this);
			image.setImageResource(i);
			flipper.addView(image, new ViewGroup.LayoutParams(
					ViewGroup.LayoutParams.FILL_PARENT,
					ViewGroup.LayoutParams.FILL_PARENT));
		}
		flipper.setOnTouchListener(this);

	}

	public boolean onTouch(View v, MotionEvent event) {
		// 터치 이벤트가 일어난 뷰가 ViewFlipper가 아니면 return
		if (v != flipper)
			return false;

		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			// 터치 시작지점 x좌표 저장
			down_x = event.getX();
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			// 터치 끝난 지점 X좌표 저장
			up_x = event.getX();

			if (up_x < down_x) {
				// 터치 할때 왼쪽방향으로 진행
				flipper.setInAnimation(AnimationUtils.loadAnimation(this,
						R.anim.push_left_in));

				flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
						R.anim.push_left_out));

				flipper.showNext();
			} else if (up_x > down_x) {
				// 터치할때 오른쪽 방향으로 진행
				flipper.setInAnimation(AnimationUtils.loadAnimation(this,
						R.anim.push_right_in));
				flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
						R.anim.push_right_out));
				flipper.showPrevious();
			}
		}
		return true;
	}
}


'Android > 기본' 카테고리의 다른 글

Xml 가져오기 (날씨)  (0) 2012.04.28
SQLite 연동하기  (1) 2012.04.28
ListIcon (ListView에 아이콘,버튼)  (0) 2012.04.28
News Service 주기적으로 데이터 가지고 오기  (0) 2012.04.28
SMSReceiver (BroadcastReceiver사용)  (0) 2012.04.28
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>


widget_icontext.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" 
	android:layout_height="60px"
	android:padding="5px">
	<ImageView 
	    android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:id="@+id/img"
		android:layout_alignParentLeft="true" />
	<TextView 
	    android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:id="@+id/text"
		android:textColor="#00ff00" 
		android:textSize="30sp"
		android:layout_toRightOf="@id/img" />
	<Button android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:id="@+id/btn"
		android:layout_alignParentRight="true" 
		android:text="주문" />
</RelativeLayout>



package kr.android.list.icon;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ListIconTest extends Activity {
	ArrayList<myitem> arItem;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		arItem = new ArrayList<myitem>();
		MyItem mi;
		mi = new MyItem(R.drawable.ic_launcher, "삼성 노트북");
		arItem.add(mi);
		mi = new MyItem(R.drawable.ic_launcher, "LG 세탁기");
		arItem.add(mi);
		mi = new MyItem(R.drawable.ic_launcher, "대우 마티즈");
		arItem.add(mi);

		MyListAdapter myAdapter = new MyListAdapter(this,
				R.layout.widget_icontext, arItem);

		ListView myList;
		myList = (ListView) findViewById(R.id.list);
		myList.setAdapter(myAdapter);
	}
}

// 리스트 뷰에 출력할 항목
class MyItem {
	int icon;
	String name;

	MyItem(int icon, String name) {
		this.icon = icon;
		this.name = name;
	}
}

// 어댑터 클래스
class MyListAdapter extends BaseAdapter {
	Context maincon;
	LayoutInflater inflater;
	ArrayList<myitem> arSrc;
	int layout;

	public MyListAdapter(Context context, int alayout, ArrayList<myitem> aarSrc) {
		maincon = context;
		arSrc = aarSrc;
		layout = alayout;
		// ListView에서 사용한 View를 정의한 xml 를 읽어오기 위해
		// LayoutInfalater 객체를 생성
		inflater = LayoutInflater.from(maincon);
	}

	public int getCount() {
		return arSrc.size();
	}

	public Object getItem(int position) {
		return arSrc.get(position).name;
	}

	public long getItemId(int position) {
		return position;
	}

	// 각 항목의 뷰 생성
	public View getView(int position, View convertView, ViewGroup parent) {
		final int pos = position;
		if (convertView == null) {
			convertView = inflater.inflate(layout, parent, false);
		}
		ImageView img = (ImageView) convertView.findViewById(R.id.img);
		img.setImageResource(arSrc.get(position).icon);

		TextView txt = (TextView) convertView.findViewById(R.id.text);
		txt.setText(arSrc.get(position).name);

		Button btn = (Button) convertView.findViewById(R.id.btn);
		btn.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				String str = arSrc.get(pos).name + "를 주문합니다.";
				Toast.makeText(maincon, str, Toast.LENGTH_SHORT).show();
			}
		});
		return convertView;
	}
}



'Android > 기본' 카테고리의 다른 글

SQLite 연동하기  (1) 2012.04.28
터치해서 화면 전환 Flipper Touch  (0) 2012.04.28
News Service 주기적으로 데이터 가지고 오기  (0) 2012.04.28
SMSReceiver (BroadcastReceiver사용)  (0) 2012.04.28
Notify 알림 메세지  (0) 2012.04.28

manifest.xml 서비스 등록 방법




Service



해당 class 클릭후 저장



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
	android:id="@+id/newsstart"  
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:text="뉴스 서비스 시작"
	/>
<Button
	android:id="@+id/newsend"  
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content" 
	android:text="뉴스 서비스 종료"
	/>
</LinearLayout>


package kr.android.news.service;
//주기적으로 데이터 가지고오기
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class NewsDemo extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button btnstart = (Button)findViewById(R.id.newsstart);
		btnstart.setOnClickListener(new Button.OnClickListener(){
			public void onClick(View v) {
				Intent intent = new Intent(NewsDemo.this,NewsService.class);
				//서비스 실행
				startService(intent);
			}
		});
		
		Button btnend = (Button)findViewById(R.id.newsend);
		btnend.setOnClickListener(new Button.OnClickListener(){
			public void onClick(View v){
				Intent intent = new Intent(NewsDemo.this, NewsService.class);
				//서비스 종료
				stopService(intent);
			}
		});
	}
}


package kr.android.news.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import android.os.Bundle;
import android.os.Message;
import android.os.Handler;

public class NewsService extends Service{
	boolean mQuit;

	public void onDestroy(){
		super.onDestroy();

		Toast.makeText(this, "Service End",4000).show();

		//run() for 문 빠져나오기 위함
		mQuit = true;
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	@Override
	public void onStart(Intent intent, int startId){
		super.onStart(intent, startId);
		NewsThread thread  = new NewsThread();
		thread.start();
	}

	class NewsThread extends Thread {
		String[] arNews = {
				"일본 , 독도는 한국땅으로 인정",
				"번데기 맛 쵸코파이 출시",
				"춘천 지역에 초거대 유전 발견",
				"한국 월드컵 결승 진출",
				"국민 소득 6만불 돌파",
				"학교 폭력 완전 근절된 것으로 조사 되지 않음",
				"안드로이드 점유율 아이폰을 앞 질렀다",
		};
		public void run(){
			for(int idx = 0; mQuit == false; idx++){
				Message msg = new Message();

				Bundle bundle = new Bundle();
										//랜덤으로 나오기 위한
				bundle.putString("news",arNews[idx % arNews.length]);
				msg.setData(bundle);
				mHandler.sendMessage(msg);
				try{
					Thread.sleep(7000);
				}catch (Exception e){
					e.printStackTrace();
				}
			}
		}
	}

	Handler mHandler = new Handler() {
		public void handleMessage(Message msg){
			String news = msg.getData().getString("news");
			Toast.makeText(NewsService.this,news,4000).show();
		}
	};
}



'Android > 기본' 카테고리의 다른 글

터치해서 화면 전환 Flipper Touch  (0) 2012.04.28
ListIcon (ListView에 아이콘,버튼)  (0) 2012.04.28
SMSReceiver (BroadcastReceiver사용)  (0) 2012.04.28
Notify 알림 메세지  (0) 2012.04.28
전화걸기2 Contact Provider  (0) 2012.04.28



생성시 Activity를 생성하지 않습니다



안에 클래스가 없는걸 확인할 수 있습니다




manifest.xml 확인



두개의 클래스 생성

NotificationMessage는 Activity를 상속합니다(extends Activity)

SMSReceiver 는BroadcastReceiver를 상속합니다(extends BroadcastReceiver)




Activity manifest.xml 등록방법은 이전게시물에 설명을 많이 했기 때문에 생략합니다(위에 Activity누르고 등록해주면됨)


SMSReceiver  리시버 등록합니다




추가가 된 모습


코드 모습



누르고 다시 add



Intent Filter




 add 클릭



Action 



SMS_RECEIVED



저장


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kr.android.sms.receiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity android:name="NotificationMessage"></activity>
        <receiver android:name="SMSReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>


package kr.android.sms.receiver;

import android.app.Activity;
import android.app.NotificationManager;
import android.os.Bundle;
import android.widget.TextView;

public class NotificationMessage extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);

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

		NotificationManager manager = (NotificationManager) 
				getSystemService(NOTIFICATION_SERVICE);

		manager.cancel(1234);

		text.setText("메세지 정상 수신");
	}
}
package kr.android.sms.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver {
	private static final int NOTIFY_ID = 1234;

	@Override
	public void onReceive(Context context, Intent intent) {
		Bundle bundle = intent.getExtras();
		SmsMessage[] smsMgs = null;
		String str = "";
		String address = "";
		if (bundle != null) {

			// PDU : sms 메세지의 산업 포맷
			Object[] pdus = (Object[]) bundle.get("pdus");

			// 가져온 Object(pdu)만큼 SmsMessage객체 생성
			smsMgs = new SmsMessage[pdus.length];
			
			for (int i = 0; i < smsMgs.length; i++) {
				//Object 배열 (pdu)에 담겨있는 메세지를 byte[]로 캐스팅하여 smsMessage에 담음
				smsMgs[i] = SmsMessage.createFromPdu((byte[]) (pdus[i]));

				// 전화번호 추출
				address += smsMgs[i].getOriginatingAddress();

				// 메세지 추출
				str += smsMgs[i].getMessageBody();
				str += "\n";
			}
			Toast.makeText(context, address + ":" + str, Toast.LENGTH_LONG)
			.show();

			// Notification status bar에 등록
			addNotificationStatusBar(context, address, str);
		}
	}

	public void addNotificationStatusBar(Context context, String address,
			String message) {

		// 1. NotificationManager 얻기
		NotificationManager nm = (NotificationManager) context
				.getSystemService(Context.NOTIFICATION_SERVICE);

		// 2. Notification 객체 생성
		Notification noti = new Notification(R.drawable.ic_launcher,
				address	+ " : " + message,
				System.currentTimeMillis());

		Intent i = new Intent(context, NotificationMessage.class);

		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i,
				0);

		noti.setLatestEventInfo(context, address, message, pendingIntent);

		nm.notify(NOTIFY_ID, noti);
	}
}


Uses Permission 지정해 줘야함


manifest.xml 접근 ->Permission ->  add



클릭



저장




실행화면


'Android > 기본' 카테고리의 다른 글

ListIcon (ListView에 아이콘,버튼)  (0) 2012.04.28
News Service 주기적으로 데이터 가지고 오기  (0) 2012.04.28
Notify 알림 메세지  (0) 2012.04.28
전화걸기2 Contact Provider  (0) 2012.04.28
안드로이드 전화걸기  (0) 2012.04.28
AndroidManifest.xml  : Activity 클래스 등록
권한설정 : android.permission.RECEIVE_SMS
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/notify"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="클릭하면 5초 후에 알림 메시지가 전달됩니다." />
    <Button
        android:id="@+id/cancel"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:text="알림 메세지를 중단합니다." />

</LinearLayout>


package kr.android.notify;

//알림 메세지
import android.app.Activity;
import android.os.Bundle;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import java.util.Timer;
import java.util.TimerTask;

public class NotifyDemo extends Activity {
	private static final int NOTIFY_ME_ID = 1337;// 식별하기 위한
	private Timer timer = new Timer();// 스레드 응용
	private int count = 0; // 카운팅하기 위한

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button btn = (Button) findViewById(R.id.notify);

		btn.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				TimerTask task = new TimerTask() {
					public void run() {
						notifyMe();
					}
				};
				// 위에 문장(TimerTask)먼저 실행되지 않고 지금 이문장이 실행되면서 task를 5초 뒤에 실행
				timer.schedule(task, 5000);
			}
		});

		btn = (Button) findViewById(R.id.cancel);

		btn.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				NotificationManager mgr = (NotificationManager)
						getSystemService(NOTIFICATION_SERVICE);

				mgr.cancel(NOTIFY_ME_ID);
			}
		});
	}

	private void notifyMe() {
		final NotificationManager mgr = (NotificationManager)
				getSystemService(NOTIFICATION_SERVICE);
		
		Notification note = new Notification(R.drawable.red_ball, "알림 메시지!",
				System.currentTimeMillis());
		
		/*=-=-=-=-=-=-=전달인자=-=-=-=-=-=-=-=-
		Context context : 실행중인  Activity 객체
		int requestCode : 현재 사용되지 않음
		Intent intent : 실행시킬 Activity 정보를 가지고 있는 Intent객체
		<int flags="">
		FLAG_CANCEL_CURRENT : 이전에 생성한 PendingIntent는 취소 새롭게 생성
		FLAG_NO_CREATE : 현재 생성된 PendingIntent 반환
		FLAG_ONE_SHOT : 생성된 PendingIntent는 단 한번만 사용가능
		FLAG_UPDATA_CURRENT: 이미 생성된 PendingIntent가 있다면 Intent의 내용 변경
		=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
		Activity 가 아닐경우에는 PendingIntent 를 사용*/
		PendingIntent i = PendingIntent.getActivity(this, 0, 
				new Intent(this,NotifyMessage.class), 0);

		note.setLatestEventInfo(this, "알림 제목", "알림 메세지 본문입니다.", i);

		//카운트는 초기화 되지 않아서 제거한뒤 다시 추가하여도 그전에 숫자까지 카운팅됨
		note.number = ++count;

		mgr.notify(NOTIFY_ME_ID, note);
	}
}


package kr.android.notify;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class NotifyMessage extends Activity{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);


		TextView txt = new TextView(this);

		txt.setText("알림 메세지!");
		setContentView(txt);

	}
}


DDMS에 접근해서


전화번호와 문자입력(한글은 안됨)





알림메세지가 기존과 다르게 나타남



AndroidManifest.xml 에 접근해서 Application에 Activity를 등록해 줘야 합니다(권한 게시물 참고)

나중에 브로드캐스트 리시버에 사용하기 위한(?) 초기단계


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
	<Button android:id="@+id/pick"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent"
		android:layout_weight="1"
		android:text="선택"
	/>
	<Button android:id="@+id/view"
		android:layout_width="fill_parent" 
		android:layout_height="fill_parent"
		android:layout_weight="1"
		android:text="보기"
	/>
</LinearLayout>


package kr.android.intent4;
//컨택트 프로바이더 사용
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.widget.Button;

public class ContactDemo extends Activity {
	Button viewButton = null;
	Uri contact = null;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button btn= (Button)findViewById(R.id.pick);

		btn.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				Intent i = new Intent(Intent.ACTION_PICK,
						Uri.parse("content://contacts/people"));
				startActivity(i);

			}
		});
		viewButton = (Button)findViewById(R.id.view);

		viewButton.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startActivity(new Intent(Intent.ACTION_VIEW,
						Uri.parse("content://contacts/people/1")));
			}
		});
	}
}




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="전화번호" />

        <EditText
            android:id="@+id/number"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:cursorVisible="true"
            android:editable="true"
            android:singleLine="true" />
    </LinearLayout>

    <Button
        android:id="@+id/dial"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="전화 걸기" />

</LinearLayout>


package kr.android.intent3;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class DialerDemo extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final EditText number = (EditText)findViewById(R.id.number);
        Button dial= (Button)findViewById(R.id.dial);
        
        dial.setOnClickListener(new Button.OnClickListener(){
			public void onClick(View v) {
				String toDial ="tel:"+number.getText().toString();
        		startActivity(new Intent(Intent.ACTION_DIAL,Uri.parse(toDial)));
			}
        });
    }
}




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
	<TableLayout
		android:layout_width="fill_parent" 
		android:layout_height="wrap_content"
		android:stretchColumns="1,2"
	>
		<TableRow>
			<TextView
				android:layout_width="wrap_content" 
				android:layout_height="wrap_content"
				android:paddingLeft="2dip"
				android:paddingRight="4dip"
				android:text="위도 경도:"
			/>
			<EditText android:id="@+id/lat"
				android:layout_width="fill_parent" 
				android:layout_height="wrap_content"
				android:cursorVisible="true"
				android:editable="true"
				android:singleLine="true"
				android:layout_weight="1"
			/>
			<EditText android:id="@+id/lon"
				android:layout_width="fill_parent" 
				android:layout_height="wrap_content"
				android:cursorVisible="true"
				android:editable="true"
				android:singleLine="true"
				android:layout_weight="1"
			/>
		</TableRow>
	</TableLayout>
	<Button android:id="@+id/map"
		android:layout_width="fill_parent" 
		android:layout_height="wrap_content"
		android:text="지도 보기!"
	/>
</LinearLayout>


package kr.android.intent2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.widget.Button;

public class LaunchDemo extends Activity {
	private EditText lat;
	private EditText lon;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button btn = (Button)findViewById(R.id.map);
		lat = (EditText)findViewById(R.id.lat);
		lon = (EditText)findViewById(R.id.lon);

		btn.setOnClickListener(new View.OnClickListener(){
			public void onClick(View view){
				String _lat=lat.getText().toString();
				String _lon=lon.getText().toString();

				Uri uri = Uri.parse("geo:"+_lat+","+_lon);

				startActivity(new Intent(Intent.ACTION_VIEW,uri));
			}
		});
	}
}




'Android > 기본' 카테고리의 다른 글

전화걸기2 Contact Provider  (0) 2012.04.28
안드로이드 전화걸기  (0) 2012.04.28
Intent 사용하여 화면 이동  (0) 2012.04.28
구글맵에 마커 표시하기(위치 지정)  (0) 2012.04.28
구글맵 사용하기  (0) 2012.04.28

+ Recent posts