public class MainActivity extends AppCompatActivity {
public static TextView textView;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) throws IllegalStateException{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Intent intent = new Intent(this,MyService.class);
startService(intent);
textView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String Hi = textView.getText().toString();
if(Hi.equals("안녕2")) {
Toast.makeText(getApplicationContext(), "성공3", Toast.LENGTH_SHORT).show();
}
}
});
}
}// MainActivity Class..
중간에 넣은 TextWatcher은 아까 배운 것에 응용하기 위해 넣은 것이다.
중요한 건
Intent intent = new Intent(this,MyService.class);
startService(intent);
이 부분이다. 인텐트를 통해서 서비스로 이동하는 부분이다.
직접 액티비티가 아닌 데이터만(호출한다) 전달이 되는 상황이다.
public class MyService extends Service {
NetworkConnectionCheck networkConnectionCheck;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // LOLLIPOP Version 이상..
if(networkConnectionCheck==null){
networkConnectionCheck=new NetworkConnectionCheck(getApplicationContext());
networkConnectionCheck.register();
}
}
return START_STICKY; // START_STICKY : 시스템에 의해 종료 되어도 다시 생성 시켜주는 것
}// onStartCommand() ..
@Override
public void onDestroy() {
super.onDestroy();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // LOLLIPOP Version 이상..
if(networkConnectionCheck!=null) networkConnectionCheck.unregister();
}
}// onDestroy()..
}
그러고 나서 MyService부분을 작성해준다.
아직 초보라 이 부분에 대해서는 조금 침묵하겠다. 헤헤..
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) //LOLLIPOP 버전 이상에서 동작
public class NetworkConnectionCheck extends ConnectivityManager.NetworkCallback { // 네트워크 변경에 대한 알림에 사용되는 Callback Class
private Context context;
private NetworkRequest networkRequest;
private ConnectivityManager connectivityManager;
public static Thread timeThread = null;
public NetworkConnectionCheck(Context context){
this.context=context;
networkRequest =
new NetworkRequest.Builder() // addTransportType : 주어진 전송 요구 사항을 빌더에 추가
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // TRANSPORT_CELLULAR : 이 네트워크가 셀룰러 전송을 사용함을 나타냅니다.
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // TRANSPORT_WIFI : 이 네트워크가 Wi-Fi 전송을 사용함을 나타냅니다.
.build();
this.connectivityManager = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE); // CONNECTIVITY_SERVICE : 네트워크 연결 관리 처리를 검색
}
public void register() { this.connectivityManager.registerNetworkCallback(networkRequest, this);}
public void unregister() {
this.connectivityManager.unregisterNetworkCallback(this);
}
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
// 네트워크가 연결되었을 때 할 동작
Toast.makeText(this.context, "network available", Toast.LENGTH_SHORT).show();
timeThread = new Thread(new timeThread());
timeThread.start(); //쓰레드실행
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
// 네트워크 연결이 끊겼을 때 할 동작
Toast.makeText(this.context, "network lost", Toast.LENGTH_SHORT).show();
}
Handler handler = new Handler(Looper.myLooper()) { //실시간 날짜를 출력해주는 핸들러
@Override
public void handleMessage(Message msg) {
Bundle bundle = msg.getData();
String dateTime = bundle.getString("dateTime");
MainActivity.textView.setText(dateTime);
}
};