일단 매인 Activity에서 Service를 시작하면 공지에 띄워서 서비스가 진행 중 임을 표시하도록 하였습니다.

 

그리고 메인 액티비티에서 버튼은 Service 시작에서 Service 종료로 이름을 바꿔주고

 

안에 처리도 바뀌도록 해놨습니다.

 

그리고 공지를 누르면 메인 액티비티로 돌아가도록 하였구요. 근데 문제는 홈을 눌렀을 때는

 

문제 없이 공지를 누르면 Service 종료 라고 뜨면서 종료할 수 있도록 되었습니다.

 

하지만 뒤로가기를 누르고 나서 공지를 눌러 들어가보면 새로운 액티비티같이 Service 시작 으로 떠서 한번 더 눌러야지 종료가

 

됩니다.

 

뒤로가기를 누르면 항상 발생 되는 로그 에러입니다.

 

06-21 16:49:42.031: ERROR/ActivityThread(1224): Activity mine.joon.WalkStreet.login.mainPage has leaked ServiceConnection mine.joon.WalkStreet.login.mainPage$2@44ee6d30 that was originally bound here

06-21 16:49:42.031: ERROR/ActivityThread(1224): android.app.ServiceConnectionLeaked: Activity mine.joon.WalkStreet.login.mainPage has leaked ServiceConnection mine.joon.WalkStreet.login.mainPage$2@44ee6d30 that was originally bound here

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.app.ContextImpl.bindService(ContextImpl.java:863)
06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.content.ContextWrapper.bindService(ContextWrapper.java:347)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at mine.joon.WalkStreet.login.mainPage$1.onClick(mainPage.java:89)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.view.View.performClick(View.java:2408)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.view.View$PerformClick.run(View.java:8816)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.os.Handler.handleCallback(Handler.java:587)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.os.Handler.dispatchMessage(Handler.java:92)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.os.Looper.loop(Looper.java:123)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-21 16:49:42.031: ERROR/ActivityThread(1224):     at java.lang.reflect.Method.invokeNative(Native Method)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at java.lang.reflect.Method.invoke(Method.java:521)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

06-21 16:49:42.031: ERROR/ActivityThread(1224):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-21 16:49:42.031: ERROR/ActivityThread(1224):     at dalvik.system.NativeStart.main(Native Method)


 

그리고 Service에 aidl을 만들어서 메인 액티비티와 통신하여 서비스가 시작인지 아닌지 체크하도록 하였습니다.

 

그 소스는 아래 부분입니다.

 

private final IRemoteServcie.Stub remoteBinder = new IRemoteServcie.Stub(){ 
        @Override
        public int getState() throws RemoteException {        
        // TODO Auto-generated method stub
                Log.v("Service-getState", "----State : " + state);
                return state;
        }
        @Override
        public void setState(int now) throws RemoteException {
                // TODO Auto-generated method stub
                state = now;   
                Log.v("Service-setState", "----State : " + state);        
        }
 };


그리고 매인 액티비티에서 서비스를 불러오고 종료하는 부분입니다.

 

 case R.id.Main_Service_Start:        
        Log.v("Main_Service_Start", "=======Start");
        if(mRemoteService != null)
        {
                try {
                        State_button = mRemoteService.getState();
                        Log.v("Main_Service_Start", "=======getState : " + State_button);
                } catch (RemoteException e1) {
                //  TODO Auto-generated catch block
                e1.printStackTrace();
                }
        }
        Log.v("Main_Service_Start", "=======1");
        if(State_button == 0 && mRemoteService == null)
        {
                Log.v("Main_Service_Start", "=======Service No");
                Toast.makeText(mainPage.this, "산책로 추천 서비스를 시작합니다.", Toast.LENGTH_SHORT).show();
                i = new Intent(context , Cservice.class);
                startService(i);
                bindService(new Intent( mainPage.this , Cservice.class), serviceConn, BIND_AUTO_CREATE);
                i = new Intent("mine.joon.servicegogo");
                startService(i);
                b_ServiceGPS.setText("서비스 중지");
                State_button = 1;
                sendNotification();     
        }else if(State_button == 1 && mRemoteService != null)
        {
                Log.v("Main_Service_Start", "=======Service Yes");
                stopService(i);  
                unbindService(serviceConn);
                i = null;
                mManager.cancel(NOTIFICATION_ID);
                mRemoteService = null;
                Toast.makeText(mainPage.this, "산책로 추천 서비스를 종료합니다.", Toast.LENGTH_SHORT).show();
                b_ServiceGPS.setText("서비스 시작");
                State_button = 0;
        }
        break;
}

 

void sendNotification()
{  
        Intent inNm = new Intent(mainPage.this, mainPage.class);
        PendingIntent launchIntent = PendingIntent.getActivity(context, 0, inNm, 0);
        
        Notification nt = new Notification(R.drawable.icon, "the Diary,left a trace", 0);
        nt.setLatestEventInfo(mainPage.this, "the Diary,left a trace", "산책로 기록중입니다.", launchIntent);
                
        mManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        mManager.notify(NOTIFICATION_ID, nt);
    }
 
private ServiceConnection serviceConn = new ServiceConnection()
{  
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
        // TODO Auto-generated method stub
        Log.v("=onServiceDisconnected=", "=======Disconnected");
        mRemoteService = null;
        }
  
        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
        // TODO Auto-generated method stub
                Log.v("=onServicdConncted=", "=======Connect");
                mRemoteService = IRemoteServcie.Stub.asInterface(arg1);
                try {
                        mRemoteService.setState(State_button);
                        Log.v("=onServicdConncted=", "=======setState : " + State_button);
                } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } 
        }
};

정말 지금 이걸로 거의 1달째 고생하고 있는데 전문가 분들 도움을 부탁드립니다.ㅠㅠ

 

왜 이러는지 이해가 가지 않습니다.  서비스에 상태를 저장하여서 다시 매인 액티비티가 살아 난다면

 

그걸 불러와서 하도록 하였는데 그게 되지도 않고... 죽을 지경입니다 ㅠㅠ

 

그리고 메니페스트에 매인 액티비티는 android:launchMode="singleInstance" 이 옵션을 줘서 한개의 액티비티만 생성되도록 하였습니다.

 

많은 조언 부탁드립니다...ㅠㅠ