한 일주일간 고생 끝네 해결했습니다.
먼저 회사에 2.1 방식을 채택하여 사용중이었습니다.
어플 <-> 회사서버
시간을 두어 전송하고 받는거였지요...
하지만, 이렇게 하면 간단하게 처리할수도 있지만,
고객이 많아지고 푸시량이 많아 질때, 또한 핸드폰에선 어플 <-> 회사서버 에 계속 연결을 하고 있어야 하기에 핸폰 배터리도 많이 달게 되죠..
안드로이드 폰 -> 설정 -> 응용프로그램 -> 실행중인 응용프로그램
에서 보시면 날씨 및 여러 어플, 뉴스 어플중에 관해서 alarm(푸시) 을 기다리고 있습니다.
이 방식은 모라 하지요?? 글쎄요.. 2.1(sdk 7) 버전까지 사용되었다가 sdk 8(2.2) 부터 는 C2DM 방식을 채택할수 있답니다.
그럼 당연히 sdk 7 에서는 C2DM 이 안되겠죠!! 그러나 2.1 방식은 2.2 에서도 실행이 됩니다. 그러나 이렇게 사용하면 과부화. ㅠㅠ
소스 전부를 올려드리고 싶지만, 보안상
간단히 흐름을 올려 드리자면요..
sdk 7 - 2.1(물론 2.2 이상도 됩니다.)
index.class
먼저 회사에 2.1 방식을 채택하여 사용중이었습니다.
어플 <-> 회사서버
시간을 두어 전송하고 받는거였지요...
하지만, 이렇게 하면 간단하게 처리할수도 있지만,
고객이 많아지고 푸시량이 많아 질때, 또한 핸드폰에선 어플 <-> 회사서버 에 계속 연결을 하고 있어야 하기에 핸폰 배터리도 많이 달게 되죠..
안드로이드 폰 -> 설정 -> 응용프로그램 -> 실행중인 응용프로그램
에서 보시면 날씨 및 여러 어플, 뉴스 어플중에 관해서 alarm(푸시) 을 기다리고 있습니다.
이 방식은 모라 하지요?? 글쎄요.. 2.1(sdk 7) 버전까지 사용되었다가 sdk 8(2.2) 부터 는 C2DM 방식을 채택할수 있답니다.
그럼 당연히 sdk 7 에서는 C2DM 이 안되겠죠!! 그러나 2.1 방식은 2.2 에서도 실행이 됩니다. 그러나 이렇게 사용하면 과부화. ㅠㅠ
소스 전부를 올려드리고 싶지만, 보안상
간단히 흐름을 올려 드리자면요..
sdk 7 - 2.1(물론 2.2 이상도 됩니다.)
index.class
PendingIntent mAlarmSender = PendingIntent.getService(this, 0, new Intent(this, NewsAlarmService.class), 0); AlarmManager am = (AlarmManager)this.getSystemService(android.content.Context.ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,NewsAlarmService .class
Integer.parseInt(this.getText(R.string.pushTime).toString()), mAlarmSender);
public class NewsAlarmService extends Service{ NotificationManager mNM; private int ID =1; private Timer timer; @Override public void onCreate() { mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); try { showNotification(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); //Log.e("test", "Error notice "+e.toString()); } //Log.e("test", "ttttttt "); // timer = new Timer(); //timer.schedule(myTask, 5000, 10*1000); // Start up the thread running the service. Note that we create a // separate thread because the service normally runs in the process's // main thread, which we don't want to block. Thread thr = new Thread(null, mTask, "mNewsAlarmService_Service"); thr.start(); } TimerTask myTask = new TimerTask() { @Override public void run() { // TODO Auto-generated method stub try { showNotification(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; @Override public void onDestroy() { // Cancel the notification -- we use the same ID that we had used to start it //mNM.cancel(R.string.alarm_service_started); // Tell the user we stopped. //Toast.makeText(this, "alram finish", Toast.LENGTH_SHORT).show(); } /** * The function that runs in our worker thread */ Runnable mTask = new Runnable() { public void run() { //Log.i("test", getText(R.string.pushTime).toString()); // Normally we would do some work here... for our sample, we will // just sleep for 30 seconds. long endTime = System.currentTimeMillis() + Integer.parseInt(getText(R.string.pushTime).toString())-10*1000; while (System.currentTimeMillis() < endTime) { synchronized (mBinder) { try { mBinder.wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } } // Done with our work... stop the service! NewsAlarmService.this.stopSelf(); } }; @Override public IBinder onBind(Intent intent) { return mBinder; } /** * Show a notification while this service is running. * @throws UnsupportedEncodingException */ private void showNotification() throws UnsupportedEncodingException { SharedPreferences common = getSharedPreferences("COMMON_MONEYTODAYNEWS",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE); if(common.getBoolean("getStock", false) || common.getBoolean("getNews", false)){ }else{ // Log.e("test", "ssssss "); return; } String result = ""; //the year data to send TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); // Log.e("test", tm.getDeviceId()); //the year data to send ArrayListRepeatingAlarm.classnameValuePairs = new ArrayList (); //nameValuePairs.add(new BasicNameValuePair("userId",URLEncoder.encode(common.getString("UID", "")))); nameValuePairs.add(new BasicNameValuePair("deviceToken",tm.getDeviceId())); if(android.os.Build.VERSION.SDK_INT <= 7){ //http post try{ HttpClient httpclient = new DefaultHttpClient(); // getMyPush.html - 원래 사용중인 파일이름!!! //HttpPost httppost = new HttpPost(getText(R.string.domain).toString()+"/pushService/getMyPush.html"); HttpPost httppost = new HttpPost("http://....../pushService/getMyPush2.html"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"euc-kr"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("test", "Error converting result "+e.toString()); } } String msg =""; String article_id = ""; String category = ""; //parse json data try{ JSONArray jArray = new JSONArray(result); Notification notification = null; for(int i=0;i 20 ) { msg = msg.substring(0,20) + ".."; } CharSequence text = msg; // Set the icon, scrolling text and timestamp notification = new Notification(R.drawable.mt_iconbig, text, System.currentTimeMillis()); notification.flags |= notification.FLAG_AUTO_CANCEL; notification.flags |= notification.DEFAULT_SOUND; notification.flags |= notification.DEFAULT_VIBRATE; // notification.number = 3; // Intent i = new Intent(this, RepeatingAlarm.class); //Uri appWidgetUri = Uri.parse("teststst"); // i.setData(appWidgetUri); //i.putExtra("AlarmID", articel_id); // The PendingIntent to launch our activity if the user selects this notification // PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, // i,PendingIntent.FLAG_UPDATE_CURRENT); // Set the info for the views that show in the notification panel. // notification.setLatestEventInfo(this, getText(R.string.alarm_service_label), // text, contentIntent); notification.setLatestEventInfo(this, text, "", makeControlPendingIntent(this,article_id)); notification.vibrate = new long[] { 100, 250, 100, 500}; // Send the notification. // We use a layout id because it is a unique number. We use it later to cancel. mNM.notify(7671, notification); //mNM.notify(Integer.parseInt(article_id.substring(10,17)), notification); // Log.i("test", "article_id"+article_id.substring(10,17)); // Thread.sleep(500); } } }catch(JSONException e){ //Log.e("test", "Error parsing data "+e.toString()); } //Log.e("test", "Error loading"); // In this sample, we'll use the same text for the ticker and the expanded notification } private PendingIntent makeControlPendingIntent(Context context, String command) { Intent active = new Intent(context,RepeatingAlarm.class); active.setAction("ACTION_VIEW"); Uri data = Uri.parse(command); // Uri data = Uri.withAppendedPath( // Uri.parse(command),appWidgetId); active.setData(data); return(PendingIntent.getBroadcast(context, 0, active, 0)); } /** * This is the object that receives interactions from clients. See RemoteService * for a more complete example. */ private final IBinder mBinder = new Binder() { @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { return super.onTransact(code, data, reply, flags); } }; }
public class RepeatingAlarm extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //Toast.makeText(context, "connect ", Toast.LENGTH_SHORT).show(); if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // Log.d("test","We got here!"); }else{ //Toast.makeText(context, intent.getData().toString(), Toast.LENGTH_SHORT).show(); Intent i = new Intent(context, MenuMt.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra("num", intent.getData().toString()); i.putExtra("type", "alarm"); context.startActivity(i); } } }
'개발도구 > aOS - 안드로이드 개발' 카테고리의 다른 글
[정리] 안드로이드 개발팁 총정리 사이트 (0) | 2011.09.08 |
---|---|
[안드로이드] Push 2 강의 - 2.2 이상 (C2DM 방식) (0) | 2011.09.07 |
[안드로이드] 안드로이드 버전 (0) | 2011.08.24 |
[펌-안드로이드] 빌드 코드(버전) 확인하는 방법 (0) | 2011.08.24 |
[안드로이드] notification (0) | 2011.08.19 |