떨림: 백그라운드 서비스

그래서 이제는 내가 진정으로 떨림을 시도할 때다.나는 최근의 개발 회의를 보았는데, 나는 Flutter의 기능과 미래의 Flutter (Web, Windows, Linux) 에 대해 놀랐다.그 회의를 보고 싶으면 여기를 클릭하세요.

출신 배경


나는 이제껏 "좋은 세상"의 것을 시도해 본 적이 없다. 나는 단지 "중대한"것을 선택했을 뿐이다. 이렇게 하면 내가 시도하고 있는 물건의 힘과 이해득실을 볼 수 있다.그래서 나는 나의 백만장자 생각 리스트에서 하나의 생각을 잡고 나의 여정을 시작했다.

응용 프로그램:Rest


나는 매우 간단한 응용 프로그램을 개발할 것이다. 나에게 매우 유용하다.나는 메닐병으로 인한 이명이 있다. 왜냐하면 때때로 나는 잠을 잘 때 휴대전화의 배경음악을 듣는 것을 좋아하기 때문이다.하지만 나는 핸드폰으로 밤새 음악을 틀게 하고 싶지 않다.

연구 중


매번 좋은 생각이 있을 때마다 나는 구글에서 그것을 검색한다.나는 바퀴를 다시 발명하고 싶지 않다.이번에 나는 이 일을 감당할 수 있는 응용 프로그램을 찾았다.문제는 그것이 자주 끊기거나 동결된다는 것이다.때때로 프로그램은 모든 단추를 매우 엉망으로 렌더링할 수 있다.그래서 나는 계속해서 간단하고 실용적인 응용 프로그램을 만들기로 결정했다.

시작합시다.


코드를 작성하기 전에 경고합니다. 저는 당신과 마찬가지로 Flitter에 새로 가입했습니다.스스로 연구하세요.이 댓글 진짜 좋아요.


일단 떨림과 다트에 대한 기본 지식을 익히면 계속 읽어라.

가장 가치 있는 선수


내 응용 프로그램과 첫 번째 버전에 대해 나는 매우 간단한 사용자 인터페이스와 간단한 기능을 원한다.나는 이러한 규격을 사용하기로 결정했다.
  • 타이머 지속 시간 5분에서 60분
  • 사용자는 시간을 5분 더 줄일 수 있다
  • 시작/중지 버튼
  • 이게 결과예요.

    응용 서비스: 떨림 방법 호출


    이 프로그램에는 카운트다운 타이머가 있습니다.타이머가 실행되고 끝날 때 음악을 끄는 서비스가 필요합니다.
    그러나 다른 프로그램이 실패하면 프로그램을 닫고 다시 열 때 서비스가 실행 중인 타이머가 지나간 시간을 알아야 상태를 업데이트하고 거기서부터 현재 시간을 표시할 수 있습니다.
    나는 이미 내가 안드로이드 서비스를 작성해야 한다는 것을 알고 연구를 해서 내가 필요로 하는 것을 얻었다.Flutter Method Call Docs

    Android 서비스 구축


    우선,android 목록(android/app/src/main/AndroidManifest.xml)에서 서비스를 설명해야 합니다
    <service android:enabled="true" android:exported="true" android:name="dev.protium.rest.AppService" />
    
    지금 우리는 서비스를 작성해야 한다.서비스는 다음과 같은 사양을 충족해야 합니다.

    1) 주 활동과의 연결을 연결할 수 있어야 한다


    이를 위해, 우리는 폴더를 사용한다
    private final IBinder binder = new AppServiceBinder();
    public class AppServiceBinder extends Binder {
            AppService getService() {
                return  AppService.this;
            }
        }
    
    @Override
    public IBinder onBind(Intent intent) {
         return binder;
    }
    

    2) 필요에 따라 현재 초 수를 시작, 중지 및 가져와야 합니다


    이 코드는 본문과 무관하지만, 문장 끝에서 환매 협의를 볼 수 있다.

    3) 음악 재생 중인 경우 일시 중지해야 합니다.


    안드로이드 장치에서 음악을 멈추는 방법이 궁금하다면, 이것이 비결이다.
    AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
    if (am.isMusicActive()) {
      long eventtime = SystemClock.uptimeMillis();
      KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE, 0);
      am.dispatchMediaKeyEvent(downEvent);
      KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE, 0);
      am.dispatchMediaKeyEvent(upEvent);
    }
    
    마술 맞죠?

    서비스에 연결


    이 점에서 너는 이미 교류가 이렇다는 것을 알아차렸을 것이다
    Android Service <-> Android Activity <-> Flutter App
    

    활성 연결에서


    이것은 매우 간단하다
    private void connectToService() {
            if (!serviceConnected) {
                Intent service = new Intent(this, AppService.class);
                startService(service);
                bindService(service, connection, Context.BIND_AUTO_CREATE);
            } else {
                Log.i(TAG, "Service already connected");
                if (keepResult != null) {
                    keepResult.success(null);
                    keepResult = null;
                }
            }
        }
    
    private ServiceConnection connection = new ServiceConnection() {
    
            @Override
            public void onServiceConnected(ComponentName className,
                                           IBinder service) {
                AppService.AppServiceBinder binder = (AppService.AppServiceBinder) service;
                appService = binder.getService();
                serviceConnected = true;
                Log.i(TAG, "Service connected");
                if (keepResult != null) {
                    keepResult.success(null);
                    keepResult = null;
                }
            }
    
            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                serviceConnected = false;
                Log.i(TAG, "Service disconnected");
            }
        };
    
    너는 keepResult 변수를 알아차렸니?나중에 자세히 설명합니다.

    진동에 활동 연결


    static final String CHANNEL = "dev.protium.rest/service";
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            GeneratedPluginRegistrant.registerWith(this);
    
            new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(this::onMethodCall);
        }
    
    나는 활동 자체에서 인터페이스를 실현하기로 결정했기 때문에 클래스 성명을 변경해야 한다
    public class MainActivity extends FlutterActivity implements MethodChannel.MethodCallHandler {
    
    지금 구현
    @Override
    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
            try {
                if (call.method.equals("connect")) {
                    connectToService();
                    keepResult = result;
                } else if (serviceConnected) {
                    if (call.method.equals("start")) {
                        appService.startTimer(call.argument("duration"));
                        result.success(null);
                    } else if (call.method.equals("stop")) {
                        appService.stopTimer();
                        result.success(null);
                    } else if (call.method.equals("getCurrentSeconds")) {
                        int sec = appService.getCurrentSeconds();
                        result.success(sec);
                    }
                } else {
                    result.error(null, "App not connected to service", null);
                }
            } catch (Exception e) {
                result.error(null, e.getMessage(), null);
            }
        }
    
    우리는 MethodChannel.Result 변수 keepResult 에 보존할 것이다.왜?우리가 서비스와 서비스를 연결할 때, 우리는 onServiceConnected 탐지기를 호출할 것이다.그곳에서, 우리는 우리가 이미 이 서비스에 연결되었다는 것을 안다.진동 프로그램은 이 리셋이 성공하거나 실패할 때까지 기다릴 것입니다.그것을 부르는 것을 잊지 마라.

    떨림과 활동을 연결시키다


    우선,lib/main의 가방을 가져와야 합니다.쏜살같이 달리다
    import 'dart:async'
    import 'package:flutter/services.dart';
    
    우리의 상태 작은 위젯 중, 우리는 이것이 필요하다
    static const MethodChannel platform = 
    MethodChannel('dev.protium.rest/service');
    
    Future<void> connectToService() async {
        try {
          await platform.invokeMethod<void>('connect');
          print('Connected to service');
        } on Exception catch (e) {
          print(e.toString());
        }
    }
    
    
    참고: 채널은 MainActivity의 채널과 메소드 이름이 같습니다.익숙하게 들리시나요?Apache Cordova 플러그인을 개발했다면 잘 알고 있을 것입니다.
    현재 우리는 이미 이 세 개의 구성 요소의 연결을 완성했다.Flitter 응용 프로그램에 연결하면 시작/중지 방법을 호출하거나 서비스 타이머에서 현재 초 수를 가져올 수 있습니다.
    final int serviceCurrentSeconds = await getServiceCurrentSeconds();
    setState(() {
        _currentSeconds = serviceCurrentSeconds;
    });
    
    임무를 완수하다.

    플리트에서 뭘 배웠는지


    앞에서 언급한 바와 같이, 나는'hellowold'응용 프로그램을 좋아하지 않는다.이 응용 프로그램은 매우 간단하지만, 그것은 해야 할 기교가 있다.나는 플리트와 다트의 유형을 사랑하게 되었다고 생각한다.이 모든 과정이 꼬박 이틀이 걸렸는데, 나는 자화자찬하는 것이 아니다.나는 어제 앉아서 노트북을 들고 있었다.나는 저녁에 응용 프로그램을 완성했다.오늘 나는 Google Play Store에 이 글을 발표했다.(겸사겸사 한 마디 하자면, 처음으로 응용 프로그램을 발표했다)
    나는 많은 기교를 배웠다. 몇 가지를 열거했다.
  • 서비스 호출 없이 소부품 테스트를 실행하는 방법
  • 먼저 응용 프로그램의 권한을 설정하여 시험 운전을 실행하는 방법
  • 얼마나 중요하고 유용한가flutter analyze너는 환매 협의에서 이 모든 것을 볼 수 있다

    protiumx 회사 / 쉬다


    잠깐 쉬고 노래 끄고.


    쉬다


    주의: 본 환매 협의는 유지되지 않습니다.
    간단한 응용 프로그램으로 일정 시간 후에 음악을 멈출 수 있다.
    이 응용 프로그램은flatter로 개발되었습니다.

    Google Play에서 설치



    발전


    종속성:
  • Android SDK
  • Android Studio
  • SDK
  • 사용 flutter doctor 의존 관계 확인

    테스트

    flutter test
    flutter drive --target=test_driver/home_page.dart 
    

    달리기

    flutter run

    화면 캡처




    대기사항

  • 점성 알림 추가
  • 음악 정지 시 토스트 메시지 표시
  • 기부하다


    만약 당신이 이 앱을 좋아한다면, 저에게 커피 한 잔 사주세요

    © Brian Mayo-2019년
    View on GitHub
    나는 이 작은 프로젝트에서 배운 다른 기교에 관한 더 많은 글을 발표할 것이다.나는 네가 개인적인 백만장자 생각 목록에서 아이디어를 얻고 Flutter로 만들어 보라고 격려한다.

    결론


    나는 내가 몇 분의 시간을 써서 예쁜 사용자 인터페이스를 얻게 되어 매우 기쁘다. 너무 많은 고통이 없다.나는 정말 Flutter 네트워크와 데스크톱을 하고 싶다.나는 이 방면의 거대한 잠재력을 보았기 때문에, 나는 나에게 회사의 수석 기술관에게 우리가 반드시 일부 제품을 Flatter로 옮겨야 한다고 말했다.우리는 다중 플랫폼 응용 프로그램(텔레비전, 스마트폰, 데스크톱, 인터넷 보기를 가진 모든 응용 프로그램)이 있기 때문에 수익이 매우 높다.
    이 프로그램을 사용해 보세요. 더 많은 기능을 마음대로 기여할 수 있습니다.나는 더 많은 기능을 추가할 계획이지만, 현재 나는 기본적인 기능을 가지고 있다.
    iOS를 컴파일하고 발표하고 싶으면 알려주세요.

    좋은 웹페이지 즐겨찾기