*스레드에서 액티비티 완전 실행 후 액티비티의 함수 실행
액티비티가 완전히 실행된 후에 액티비티의 함수를 실행하기 위해서는 몇 가지 방법이 있습니다. 여기에는 몇 가지 일반적인 접근 방식이 있습니다.
-Handler를 사용하는 방법:
CameraActivity 클래스 내에 Handler 객체를 생성합니다.
BackgroundThread 클래스에서 CameraActivity 인스턴스를 가져올 수 있는 방법이 있다면(예: 액티비티를 생성한 Context를 가지고 있는 경우), 해당 인스턴스의 Handler를 사용하여 메시지를 보낼 수 있습니다.
BackgroundThread 클래스에서 CameraActivity 인스턴스를 가져올 수 없는 경우, 액티비티가 실행될 때까지 일시적으로 대기하도록 설정한 후, Handler를 사용하여 메시지를 보내는 방법도 있습니다.
-BroadcastReceiver를 사용하는 방법:
CameraActivity 클래스에서 BroadcastReceiver를 정의하고 등록합니다.
BackgroundThread 클래스에서 CameraActivity를 인텐트로 시작한 후에, BroadcastReceiver를 통해 액티비티가 완전히 실행되었음을 알리는 브로드캐스트 메시지를 보냅니다.
CameraActivity의 BroadcastReceiver에서 메시지를 수신하고, 그 이후에 CameraActivity.setCount(Count)를 호출하여 이미지뷰를 변경합니다.
-***콜백 인터페이스를 사용하는 방법(적용)
CameraActivity 클래스에서 콜백 인터페이스를 정의합니다.
BackgroundThread 클래스에서 CameraActivity의 인스턴스를 가져올 수 있는 방법이 있다면, 해당 인스턴스에 대한 콜백 인터페이스 메서드를 호출합니다.
CameraActivity 클래스에서 콜백 인터페이스의 메서드를 구현하고, 메서드 내에서 CameraActivity.setCount(Count)를 호출하여 이미지뷰를 변경합니다.
이러한 접근 방식 중 하나를 선택하여 상황에 맞게 구현하면 됩니다. 선택한 방법에 따라 코드를 작성하여 실행 흐름을 제어할 수 있습니다.
-***콜백 인터페이스를 사용하는 방법(적용)
콜백 인터페이스를 사용하여 CameraActivity가 완전히 실행된 후에 CameraActivity.setCount(Count)를 호출하는 방법을 보여드리겠습니다.
먼저, CameraActivity 클래스에서 콜백 인터페이스를 정의하고 해당 인터페이스를 구현합니다.
```java
public class CameraActivity extends AppCompatActivity {
public interface Callback {
void onCameraActivityReady();
}
private Callback callback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
}
public void setCount(int count) {
// 이미지뷰를 변경하는 코드 실행
// ...
}
public void setCallback(Callback callback) {
this.callback = callback;
if (callback != null) {
callback.onCameraActivityReady(); // 콜백 호출
}
}
}
```
위의 예시 코드에서는 CameraActivity 클래스에서 Callback 인터페이스를 정의하고, setCallback 메서드를 구현합니다. setCallback 메서드에서 콜백 객체를 받고, 콜백 객체가 null이 아닌 경우 onCameraActivityReady 메서드를 호출합니다.
다음으로, BackgroundThread 클래스에서 CameraActivity의 인스턴스를 가져올 수 있는 방법이 있다면, 해당 인스턴스에 대한 콜백 인터페이스 메서드를 호출합니다.
```java
public class BackgroundThread extends Thread {
private CameraActivity cameraActivity;
public BackgroundThread(CameraActivity cameraActivity) {
this.cameraActivity = cameraActivity;
}
@Override
public void run() {
// Background 작업 수행
// ...
int count = 10; // 예시로 임의의 값 설정
// CameraActivity가 완전히 실행된 후에 CameraActivity.setCount(Count) 호출
cameraActivity.setCallback(new CameraActivity.Callback() {
@Override
public void onCameraActivityReady() {
cameraActivity.setCount(count);
}
});
}
}
```
위의 예시 코드에서는 BackgroundThread 클래스에서 CameraActivity의 인스턴스를 받아 생성자로 전달합니다. 그리고 setCallback 메서드를 사용하여 CameraActivity의 콜백 인터페이스를 호출합니다. 이를 통해 BackgroundThread에서 CameraActivity의 setCount 메서드를 호출할 수 있습니다.
이렇게 하면 BackgroundThread에서 CameraActivity의 메서드를 호출할 때 액티비티가 완전히 실행된 이후에 호출되므로 이미지뷰를 변경할 수 있습니다.
---------------------나머지 방법---------------------
*Handler를 사용하는 방법
-Application 클래스의 context를 사용하여 CameraActivity의 Handler에 메시지를 보내는 방법
먼저, CameraActivity 클래스에서 Handler 객체를 생성하고, Application 클래스에서 해당 Handler에 접근할 수 있도록 정적 메서드를 추가
public class CameraActivity extends AppCompatActivity {
private static Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
handler = new Handler(Looper.getMainLooper()); // 메인 스레드의 Looper를 사용하는 Handler 생성
}
public void setCount(int count) {
// 이미지뷰를 변경하는 코드 실행
// ...
}
public static Handler getHandler() {
return handler;
}
}
다음으로, BackgroundThread 클래스에서 Application 클래스의 context를 사용하여 CameraActivity의 Handler를 얻고, 이를 통해 메시지를 보내기
public class BackgroundThread extends Thread {
private Context applicationContext;
public BackgroundThread(Context context) {
applicationContext = context.getApplicationContext();
}
@Override
public void run() {
// Background 작업 수행
// ...
int count = 10; // 예시로 임의의 값 설정
// CameraActivity의 Handler에 메시지를 보내기
Handler handler = CameraActivity.getHandler();
if (handler != null) {
handler.post(new Runnable() {
@Override
public void run() {
CameraActivity cameraActivity = (CameraActivity) applicationContext.startActivity(new Intent(applicationContext, CameraActivity.class));
cameraActivity.setCount(count);
}
});
}
}
}
위의 예시 코드에서는 BackgroundThread 클래스에서 CameraActivity의 Handler를 얻기 위해 CameraActivity.getHandler()를 호출합니다. 그리고 Handler의 post 메서드를 사용하여 메인 스레드에서 실행되도록 하여 CameraActivity 인스턴스를 생성한 후에 setCount 메서드를 호출합니다.
따라서, Application 클래스의 context를 사용하여 CameraActivity의 Handler를 통해 메시지를 보내면, CameraActivity가 완전히 실행된 이후에 setCount 메서드가 호출되어 이미지뷰를 변경할 수 있습니다.
*BroadcastReceiver를 사용하는 방법
BroadcastReceiver를 사용하여 CameraActivity가 완전히 실행된 후에 CameraActivity.setCount(Count)를 호출하는 방법을 보여드리겠습니다.
먼저, CameraActivity 클래스에서 BroadcastReceiver를 정의하고 등록하는 방법을 보여드리겠습니다.
```java
public class CameraActivity extends AppCompatActivity {
private BroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
// BroadcastReceiver 생성
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// BroadcastReceiver가 호출될 때 CameraActivity.setCount(Count) 호출
int count = intent.getIntExtra("count", 0);
setCount(count);
}
};
// BroadcastReceiver 등록
IntentFilter intentFilter = new IntentFilter("com.example.ACTION_COUNT_UPDATED");
registerReceiver(broadcastReceiver, intentFilter);
}
public void setCount(int count) {
// 이미지뷰를 변경하는 코드 실행
// ...
}
@Override
protected void onDestroy() {
super.onDestroy();
// BroadcastReceiver 등록 해제
unregisterReceiver(broadcastReceiver);
}
}
```
위의 예시 코드에서는 CameraActivity 클래스 내에 BroadcastReceiver를 정의하고, onCreate 메서드에서 해당 BroadcastReceiver를 등록합니다. BroadcastReceiver의 onReceive 메서드에서 CameraActivity.setCount(Count)를 호출하여 이미지뷰를 변경합니다. onDestroy 메서드에서는 BroadcastReceiver를 등록 해제합니다.
다음으로, BackgroundThread 클래스에서 CameraActivity를 인텐트로 시작한 후에 BroadcastReceiver를 통해 CameraActivity가 완전히 실행되었음을 알리는 브로드캐스트 메시지를 보내는 방법을 보여드리겠습니다.
```java
public class BackgroundThread extends Thread {
private Context applicationContext;
public BackgroundThread(Context context) {
applicationContext = context.getApplicationContext();
}
@Override
public void run() {
// Background 작업 수행
// ...
int count = 10; // 예시로 임의의 값 설정
// CameraActivity를 인텐트로 시작
Intent intent = new Intent(applicationContext, CameraActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
applicationContext.startActivity(intent);
// CameraActivity가 완전히 실행된 후에 알림을 보내는 브로드캐스트 메시지 발송
Intent countIntent = new Intent("com.example.ACTION_COUNT_UPDATED");
countIntent.putExtra("count", count);
applicationContext.sendBroadcast(countIntent);
}
}
```
위의 예시 코드에서는 BackgroundThread 클래스에서 CameraActivity를 인텐트로 시작한 후, CameraActivity가 완전히 실행된 후에 알림을 보내는 브로드캐스트 메시지를 발송합니다. 메시지에는 변경할 Count 값이 포함되어 있습니다.
이렇게 하면 BackgroundThread에서 CameraActivity를 인텐트로 시작한 후에 브로드캐스트 메시지를 통해 CameraActivity가 완전히 실행되었음을 알릴 수 있습니다. CameraActivity는 BroadcastReceiver에서 메시지를 수신하고, 그 이후에
CameraActivity.setCount(Count)를 호출하여 이미지뷰를 변경할 수 있습니다.
'+)기록 > 과제' 카테고리의 다른 글
정리사항 69 - <Preference /> 설정 항목 클릭 이벤트(setOnPreferenceClickListener, public boolean onPreferenceTreeClick) (0) | 2023.06.09 |
---|---|
정리사항 68 - android.graphics.Rect(직사각형) (0) | 2023.06.09 |
정리사항 66 - 커스텀 다이얼로그 제어(키보드 상호작용) (0) | 2023.05.24 |
정리사항 65 - PendingIntent 개념 (0) | 2023.05.16 |
정리사항 64 - AlarmManager, BroadcastReceiver class(설정한 시간마다 앱 자동 재실행 구현) (0) | 2023.05.15 |