profile image

L o a d i n g . . .

반응형


안드로이드 서비스 이해하기

To understand Android Service


안드로이드에는 눈에 보이지 않은 서비스가 존재하는데, 

서비스도 애플리케이션의 구성요소이므로 시스템에서 관리를 한다.

서비스는 기기에 항상 실행되어 있는 상태로 다른 기기과 데이터를 주고 받거나 상태를 모니터링 한다.

그래서 서비스를 실행해 두면 상태가 계속 유지되어야 한다


Android have service that invisible

The service is also a component of the application and is managed by the system

The service is always running on the device and data is exchanged with other device or statuse is monitoring

So service running with device is always running or stay


public class MainActivity extends AppCompatActivity {

private EditText editText;
private Button button;

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

editText = (EditText) findViewById(R.id.editText);

button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = editText.getText().toString();

Intent intent = new Intent(getApplicationContext(), MyService.class);
intent.putExtra("command","show");
intent.putExtra("name", name);

// 화면을 띄워줄 때는 startActivity();이지만
// 화면이 아니라 서비스를 띄워줄 때는 startService();

// use the startActivity() when displaying the screen

// user the startService() when use service

startService(intent);
}
});
}

메인 엑티비티이며 Intent.putExtra()을 이용하여 command와 name 2개의 key을 서비스로 보낸다.

이러한 과정은 Intent를 이용해서 데이터를 넘기는 방법과 같은데

Intent의 경우 startActivicty();을 쓰지만, 서비스로 데이터를 넘길 경우 startService();를 사용한다.


It is MainActivity sending the two key that command and name used Intent.putExtra()

This process is like using intent to sending

For Intent using startActivity() but for sending to service using startService()


public class MyService extends Service {

private static final String TAG = "MyService";

public MyService() {
}

// 서비스로서 동작하는 초기 시점

// an initial point of service
@Override
public void onCreate() {
super.onCreate();

Log.d(TAG, "onCreate() 호출됨");
}

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

Log.d(TAG, "onDestory() 호출됨");
}

// intent로 넘어온 데이터를 확인할 때는
// onStartCommand()로 확인 -> 명령어 처리

// check the data when transmitted to intent

// confirm with onStartCommand() -> command processing
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

Log.d(TAG, "onStartCommand() 호출됨");

processCommand(intent);

return super.onStartCommand(intent, flags, startId);

}

private void processCommand(Intent intent) {
String command = intent.getStringExtra("command");
String name = intent.getStringExtra("name");

Log.d(TAG, "전달받은 데이터"+ command + name);
}


@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}

MyService라는 클래스를 만들었으며 service를 상속한다.

생성자를 정의하고 onCreate(), onDestory(), onStartCommand() 3개 메소드를 오버라이딩한다.

onCreate()메소드는 서비스가 동작하는 초기시점이이다.

onStarntCommand()메소드는 intent로 넘어온 데이터를 확인하는 메소드이다.

processCommand 메소드는 직접 만든 메소드로 인텐트로 넘어온 데이터를 변수에 담아 보여주는 메소드이다.


I created a class called MuService and extends Service

Generate a constructor and trhree method that onCreate(), onDestory(), onStartCommand() are override

onCreate() method is initial point the service poerates

onStartCommand() method is check the data that has been transferred to an intent

I create ProcessCommand method, it's method show data has been transferred to the intent


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

Log.d(TAG, "onStartCommand() 호출됨");

if (intent == null) {
// 다시 자동으로 실행해달라는 옵션
return Service.START_STICKY;
} else {
processCommand(intent);
}

return super.onStartCommand(intent, flags, startId);

}

private void processCommand(Intent intent) {
String command = intent.getStringExtra("command");
String name = intent.getStringExtra("name");

Log.d(TAG, "전달받은 데이터"+ command + name);

// 서비스에서 다시 메인엑티비티로 보내기
try {
// 5초 대기
// wating 5 second
Thread.sleep(5000);

} catch (Exception e) {}

Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
// 화면이 없는 데서 화면이 있는 걸 띄우기 위해
// 일반적으로 이 3가지 옵션을 함께줌
// to display the screen from the absence of a screen
// generally, these three potions are included
showIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TOP);
showIntent.putExtra("command", "show");
showIntent.putExtra("name", name+"from service");
startActivity(showIntent);
}

서비스에서 다시 다른 엑티비티로 데이터를 보내줄 경우 똑같이 인텐트를 이용하는데 방법이 조금 다르다.

intent.addFlags()를 추가로 사용해야하는데 이는 액티비티를 정리해주는..? 나도 다시 공부해보아야 한다..이건

기본적으로 FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP 이 3가지 옵션을 준다.


If the service sends data back to another entitlement, the method of using the content is a little different

I need to use more intent.addFlags(), it cleans up the activity...? i have to study again this is...

Basially need to three option that FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP


    Intent passedIntent = getIntent();
processCommand(passedIntent);
}

// 이미 MainActivity가 만들어져 있는 상태에서
// OnCreate()가 호출되지 않고 onNewIntent()가 호출됨
// with MainActivity already built
// OnCreate() is not called and onNewIntent() is called
@Override
protected void onNewIntent(Intent intent) {
processCommand(intent);

super.onNewIntent(intent);
}

private void processCommand(Intent intent) {
if (intent != null) {
String command = intent.getStringExtra("command");
String name = intent.getStringExtra("name");

Toast.makeText(this, "서비스로부터 전달받은 데이터 : " + command + "," + name, Toast.LENGTH_LONG).show();
}
}

다시 메인액티비티로와서 서비스에서 넘어온 데이터를 받도록 한다.

이미 메인엑티비티가 만들어져 있고 메모리에 올라가 있는 경우 

onNewIntent를 오버라이딩하도록 한다.

데이터를 받는것은 기존의 intent.getStringExtra(key);를 이용해서 받으면 된다.


Return to MainActivity to receive data from the service

If the MainActivity has already been created and is in memory

Allow onNewIntent to be override

Receiving data can be done using the existing intent.getStringExtra(key);




we don't make mistakes, we have happy accidents

반응형
복사했습니다!