티스토리 뷰
서비스 구현하고, Manifest.xml 에 서비스 등록을 해줘야 한다.
ClientTest.zip(소켓 프로그램 아님, 이클립스 프로젝트)
서비스 시작하면, onCreate(), onSatrtCommand() 자동 호출
onCreate() : 최소의 초기화만 한다
onStartCommand(), onBind() : 나머지 초기화 한다.
서비스 종료되면 onDestroy() 호출 된다.
ClientTest.java (서비스 제어, 시작/종료)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package kr.co.company.clienttest; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.os.Bundle; import android.os.StrictMode; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class ClientTest extends Activity { @TargetApi(Build.VERSION_CODES.GINGERBREAD) @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(ClientTest.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(ClientTest.this, NewsService.class); stopService(intent); // 서비스 종료 } }); } } |
NewsService.java (서비스 구현)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
package kr.co.company.clienttest; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.widget.Toast; public class NewsService extends Service { boolean mQuit; public void onCreate() { super.onCreate(); } public void onDestroy() { super.onDestroy(); Toast.makeText(this, "서비스 종료", Toast.LENGTH_SHORT).show(); mQuit = true; } public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); mQuit = false; NewsThread thread = new NewsThread(this, mHandler); thread.start(); return START_STICKY; // 안드로이드에서 지원 } public IBinder onBind(Intent intent) { return null; // 원격 호출 지원하지 않아도 구현 해줘야 한다. } class NewsThread extends Thread { NewsService mParent; Handler mHandler; String[] arNews = { "11111", "2222", "3333", "4444", "5555" }; public NewsThread(NewsService parent, Handler handler) { mParent = parent; mHandler = handler; } public void run() { // 서비스 기능 구현 for(int i=0; mQuit == false; i++) { Message msg = new Message(); msg.what = 0; msg.obj = arNews[i % arNews.length]; mHandler.sendMessage(msg); try { Thread.sleep(5000); } catch(Exception e) { ; } } } } Handler mHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what == 0) { String news = (String)msg.obj; Toast.makeText(NewsService.this, news, Toast.LENGTH_SHORT).show(); } } }; } |
Manifest.xml (서비스 등록)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kr.co.company.clienttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="kr.co.company.clienttest.ClientTest" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".NewsService" android:enabled="true" > <intent-filter> <action android:name="kr.co.company.NEWS"/> <!-- 다른 패키지에서 이 서비스 이용 시 필요 --> </intent-filter> </service> </application> </manifest> |
실행화면
위 그림에서 서비스 시작 버튼을 누르면 뉴스 (1111) 를 보여준다.