Service Bind



Service Bind  란,

클라이언트 - 서버 인터페이스 안의 서버를 말합니다.

쉽게 말해, Service 가 일종의 서버가 되어서 클래스에서 요청을 하면 응답을 해준다 라고 보시면 됩니다.


바인드된 서비스는, 애플리케이션이 종료되면 없어집니다.

따라서, 계속해서 사용하지 않는 서비스는 이것을 이용하면 효율적이라 생각이 됩니다.




Bind


바인드된 서비스를 이용하려면 onBind() 메서드를 오버라이드 해야 합니다.

이를 통해, 다른 애플리케이션이 이 서비스에 바인드 하여 상호작용 할 수 있습니다.


LocalBinder 클래스 의 getService() 함수를 통해 Binder 에 접근 할 수 있습니다.


public class LocalService extends Service {
   
// Binder given to clients
   
private final IBinder mBinder = new LocalBinder();
   
// Random number generator
   
private final Random mGenerator = new Random();

   
/**
     * Class used for the client Binder.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with IPC.
     */

   
public class LocalBinder extends Binder {
       
LocalService getService() {
           
// Return this instance of LocalService so clients can call public methods
           
return LocalService.this;
       
}
   
}

   
@Override
   
public IBinder onBind(Intent intent) {
       
return mBinder;
   
}

   
/** method for clients */
   
public int getRandomNumber() {
     
return mGenerator.nextInt(100);
   
}
}


주목해야 할 것은 LocalBinder 클래스와 onBind 에 바인드된 iBinder

그리고, public 으로 선언된 getRandomNumber() 함수 입니다.

Binder 를 통해 위 함수에 접근 할 수 있는 것이죠.





Call Bind Service


ServiceConnection 을 통해 서비스객체에 접근 합니다.


public class BindingActivity extends Activity {
   
LocalService mService;
   
boolean mBound = false;

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

   
@Override
   
protected void onStart() {
       
super.onStart();
       
// Bind to LocalService
       
Intent intent = new Intent(this, LocalService.class);
        bindService
(intent, mConnection, Context.BIND_AUTO_CREATE);
   
}

   
@Override
   
protected void onStop() {
       
super.onStop();
       
// Unbind from the service
       
if (mBound) {
            unbindService
(mConnection);
            mBound
= false;
       
}
   
}

   
/** Called when a button is clicked (the button in the layout file attaches to
      * this method with the android:onClick attribute) */

   
public void onButtonClick(View v) {
       
if (mBound) {
           
// Call a method from the LocalService.
           
// However, if this call were something that might hang, then this request should
           
// occur in a separate thread to avoid slowing down the activity performance.
           
int num = mService.getRandomNumber();
           
Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
       
}
   
}

   
/** Defines callbacks for service binding, passed to bindService() */
   
private ServiceConnection mConnection = new ServiceConnection() {

       
@Override
       
public void onServiceConnected(ComponentName className,
               
IBinder service) {
           
// We've bound to LocalService, cast the IBinder and get LocalService instance
           
LocalBinder binder = (LocalBinder) service;
            mService
= binder.getService();
            mBound
= true;
       
}

       
@Override
       
public void onServiceDisconnected(ComponentName arg0) {
            mBound
= false;
       
}
   
};
}


ServiceConnection 으로 Binder 를 가져와서 Service 객체를 얻어옵니다.

mService 객체를 통해 public 함수인 getRandomNumber () 를 가져올 수 있습니다.






출처 : https://developer.android.com/guide/components/bound-services.html?hl=ko#Binder

Posted by 자바리즘
,

POSTMAN



크롬의 PostMan 이라는 앱을 이용해서 Cloud Message 테스트를 할 수 있습니다.



크롬웹스토어 에서 Postman 검색 하고 설치






Postman 을 실행한 화면



 


 

 

헤더설정

헤더설정 안하면 안됩니당

 

 




세부설정 그리고 Send

raw 로 바꾸면 알아서 JSON 타입으로 변할 거에요.




 


 

Response


200 코드가 와야 제대로 된 것이겠죠? 아래와 같은 Json 을 반환해야 해요.


{

    "multicast_id": 5923447248623882687,

    "success": 1,

    "failure": 0,

    "canonical_ids": 0,

    "results": [

        {

            "message_id": "dfd0908ndmfkldlfldlfdll"

        }

    ]

}


성공이 1이래요. 성공한 것이죠.

 

 

 

근데 이 Tool 이 편하긴 한데, 30일 무료버전이라네요. 어쩐지 쓸만하더라.


감사합니다.

'안드로이드 > Firebase' 카테고리의 다른 글

Firebase Cloud Message -1  (0) 2017.08.08
Posted by 자바리즘
,

Firebase 클라우드 메시징 클라이언트 앱 설정


https://firebase.google.com/docs/cloud-messaging/android/client?hl=ko



위 사이트에 정말 자세히 나와있다. 잘 참고하시고.

 

 

 

 

내 토큰 받아오는 방법


ewAPA91bFdAPnc-p0aSd6_xTTIUVX5TfPLWK6rPRgx1O... 개별 기기마다 푸쉬를 보내고 싶다면 이와 같은 토큰을 받아와서 서버에 저장해 놔야 한다.


FirebaseInstanceId.getInstance().getToken() 으로 받아 올 수 있으니 나중에 서버에 저장할 때 여기서

받아와서 저장하세요.
 

 

 

 

 

서버토큰

이곳에서 찾으세요. 다른데서 헤매지 마시고

 

 

 

 

 

 

메시지테스트 - 알림메시지


알림메시지를 이용해서 FCM 테스트를 할 수 있습니다.

아주아주 잘 옵니다.

 



 

 


 

오류


가이드 웹페이지에서 시키는 대로 다 했는데, NullPointerError 가 날 때가 있습니다.

onCreate() 에서


FirebaseApp.initializeApp(this);


호출하시고,



모듈의 build.gradle 맨 하단에 

apply plugin: 'com.google.gms.google-services'


추가하세요.

 

 

 

일단 1부는 여기까지.

감사합니다.


'안드로이드 > Firebase' 카테고리의 다른 글

Firebase Cloud Message -2  (0) 2017.08.08
Posted by 자바리즘
,

Error:Execution failed for task ':app:packageRelease'.

> com.android.ide.common.signing.KeytoolException: Failed to read key hunetmlearning from store "C:/경로/키스토어이름.keystore": Keystore was tampered with, or password was incorrect




안드로이드 스튜디오에서 사인한 앱을 빌드 할 때 위와 같은 에러가 간혹 발생한다.



비밀번호가 틀렸다는데, 



난 전혀 바꾼적이 없는데.


왜 그러는지는 알 수 없었지만 해결방법은 있었다.




터미널에서


keytool -storepasswd -keystore C:/경로/키스토어이름.keystore


입력한다.




C:/경로/키스토어이름.keystore 이 부분은 각자 keystore 파일 경로에 맞게 변경해주면 된다.




키스토어 비밀번호를 바꾸라는 문구가 나오고 원래 비밀번호로 바꾸고 나니 빌드 완료!


'안드로이드 > TIP' 카테고리의 다른 글

build.gradle lintOptions  (0) 2017.08.18
키스토어 정보 알아내기  (0) 2017.08.17
유용하게 개발하기  (0) 2017.06.21
Status bar Icon Size  (0) 2015.03.20
해상도별 아이콘 / 스플래시 이미지 사이즈  (0) 2015.03.06
Posted by 자바리즘
,

fabric


홈페이지 : fabric.io

 


 

Crashlytics 적용 경로





안드로이드 스튜디오 에서 플러그인 설치

https://fabric.io/downloads/android-studio


 



자세한 설명 (build.gradle 설정 관련)

https://fabric.io/kits/android/crashlytics/install

 

 

 

 

처음엔 복잡하다 생각했지만, 막상 적용하니 별거 아니였다;; ㅎㅎ

'안드로이드' 카테고리의 다른 글

Exo Player -1  (0) 2017.07.12
안드로이드 어노테이션 @CheckResult  (0) 2017.06.21
안드로이드 크래쉬 리포트  (0) 2015.02.10
windowSoftInputMode  (0) 2015.02.10
ViewPager 와 SwipeRefreshLayout  (2) 2015.01.19
Posted by 자바리즘
,

Object 형 반환


AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUserDetail/{userId}")
                .addPathParameter("userId", "1")
                .setTag(this)
                .setPriority(Priority.LOW)
                .build()
                .getAsObject(User.class, new ParsedRequestListener() {
                     @Override
                     public void onResponse(User user) {
                        // do anything with response
                        Log.d(TAG, "id : " + user.id);
                        Log.d(TAG, "firstname : " + user.firstname);
                        Log.d(TAG, "lastname : " + user.lastname);
                     }
                     @Override
                     public void onError(ANError anError) {
                        // handle error
                     }
                 }); 



참조 클래스

private class User {
    public String id;
    public String firstname;
    public String lastname;
}



예제 일 뿐 이고, 각 유형에 맞게 바꿔서 적용하시면 됩니다~

'안드로이드 > Library' 카테고리의 다른 글

Fast Android Networking  (0) 2017.07.18
Android Debug Database  (0) 2017.07.13
DB Brower for SQLite  (0) 2017.07.12
쓸만한 이미지로더 라이브러리  (0) 2014.07.17
Posted by 자바리즘
,

Get Started




build.gradle

dependencies {
    compile 'com.amitshekhar.android:android-networking:1.0.0'
}


onCreate 선언
  AndroidNetworking.initialize(getApplicationContext());


GET
AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")
                 .addPathParameter("pageNumber", "0")
                 .addQueryParameter("limit", "3")
                 .addHeaders("token", "1234")
                 .setTag("test")
                 .setPriority(Priority.LOW)
                 .build()
                 .getAsJSONArray(new JSONArrayRequestListener() {
                    @Override
                    public void onResponse(JSONArray response) {
                      // do anything with response
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error
                    }
                });



POST
AndroidNetworking.post("https://fierce-cove-29863.herokuapp.com/createAnUser")
                 .addBodyParameter("firstname", "Amit")
                 .addBodyParameter("lastname", "Shekhar")
                 .setTag("test")
                 .setPriority(Priority.MEDIUM)
                 .build()
                 .getAsJSONObject(new JSONObjectRequestListener() {
                    @Override
                    public void onResponse(JSONObject response) {
                      // do anything with response
                    }
                    @Override
                    public void onError(ANError error) {
                      // handle error
                    }
                });



Cancel Request
  AndroidNetworking.cancel("tag"); 
  AndroidNetworking.forceCancel("tag");

  AndroidNetworking.cancelAll(); 
  AndroidNetworking.forceCancelAll();




위의 Post 와 Get 방식을 호출하는 부분에서 setTag() 함수로 태그 지정을 한 부분을 볼 수 있다.

지정한 태그로 취소요청을 내릴 수 있다. 해당 태그를 전부 Cancel 하거나 태그에 상관없이 취소할 수 있다.


다음 포스팅에서는 더욱 더 깊게 FAN 을 들어가봐야 겠다.





출처 : https://github.com/amitshekhariitbhu/Fast-Android-Networking


'안드로이드 > Library' 카테고리의 다른 글

Fast Android Networking -2  (0) 2017.07.20
Android Debug Database  (0) 2017.07.13
DB Brower for SQLite  (0) 2017.07.12
쓸만한 이미지로더 라이브러리  (0) 2014.07.17
Posted by 자바리즘
,