2016-10-10 1 views
3

사용자가 Android 시스템 시간을 변경할 때 환경 설정에 부울을 저장하고 싶습니다.앱 종료시 TIME_SET 브로드 캐스트 수신

<receiver android:name="test.TimeChangedReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.TIME_SET" /> 
     <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
    </intent-filter> 
</receiver> 

TimeChangedReceiver는 브로드 캐스트 리시버를 확장하고() onReceive를 오버라이드 (override) : 그러므로 나는 매니페스트에 ACTION_TIME_CHANGED 방송 활동을 추가했다. 이 클래스에서 부울이 저장되고 알림이 표시됩니다. 응용 프로그램이 닫힐 때까지

public class TimeChangedReceiver extends BroadcastReceiver { 

private static final String TAG = "TimeChangedReceiver"; 

public TimeChangedReceiver() { 
    super(); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 

    // store boolean to SharedPreferences 
    PreferenceUtils.getInstance().storeBoolean(true, PreferenceUtils.CHECK_LICENSE); 

    // build notification 
    int icon = android.R.drawable.ic_dialog_alert; 
    String title = "changed time"; 
    String text = "user changed time"; 

    long when = System.currentTimeMillis(); 
    String timezone = intent.getStringExtra("time-zone"); 
    Notification notification = new Notification(icon, title, when); 
    NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    int notification_id = (int) System.currentTimeMillis(); 
    Intent notificationIntent = new Intent(context, MainView.class); 
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    notificationIntent.putExtra("time-zone", timezone); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT); 
    notification.setLatestEventInfo(context, title, text, contentIntent); 
    mgr.notify(notification_id, notification); 
} 

}

모든 것이 잘 작동 - 더 이상 백그라운드에서 실행 해 없습니다. 여기

는 말한다 :


가 어떻게이 어쨌든 방송하고 부울을 저장할받을 수 있습니까?

알림을 볼 필요가 없습니다. 가입일

+0

'android : enabled = "true"'와'android : enabled = "true"를'android : name = "..."'속성 뒤 또는 앞에 추가하십시오. – Marat

+0

기본적으로 사용 가능합니다^ –

+0

@Marat [link] (https://developer.android.com/guide/topics/manifest/receiver-element.html) 기본값은 "true"입니다. 그것은 아무것도 바뀌지 않습니다. : – maryBlaa

답변

1

앱이 닫힐 때까지 모든 것이 정상적으로 작동합니다. 배경에서 더 이상 런닝하지 않습니다.

응용 프로그램을 강제 종료하고 나중에 날짜를 변경하면 로그가 남지 않습니다.

귀하의 관찰 결과가 정상이며 정상적인 것으로 간주됩니다. 시스템 설정을 통해 "강제 정지"를 수행 한 후 BroadcastReceiver은 AndroidManifest.xml에 선언 한 경우에도 더 이상 메시지를받지 않습니다. "강제 정지"를 실행하면 기본적으로 시스템에 지시합니다. "이 응용 프로그램을 지금 중지하고 다시 실행하지 마십시오."관리 작업이므로 시스템 설정에서만 액세스 할 수 있습니다. 이게 말이 되니? 새로 설치 한 앱에서도 마찬가지입니다. 최소한 한 번 시작될 때까지 브로드 캐스트 인 텐트를 수신하지 않습니다.

이것이 Android 시스템 설계 방법입니다. 당신은 그것에 대해 아무 것도 할 수 없습니다.

어떻게하면 브로드 캐스트를 수신하고 부울을 저장할 수 있습니까?

는 "강제 종료"후

앱 (또는 그것의 하나의 구성 요소)를 수동으로 (재) 다시 사용자 적어도 한 번에 의해 시작되어야한다. 이 경우 AndroidManifest.xml에 선언 된 수신자는 전체 시스템 재부팅 후에도 예상대로 브로드 캐스트 인 텐트를 수신합니다.

"강제 정지"를 시스템이 앱을 파괴하는 상황 (예 : 메모리 부족)과 혼동해서는 안됩니다. 이것들은 동일하지 않습니다. "강제 정지"가 응용 프로그램에 영구 플래그를 설정하여 다시 실행되지 않도록합니다.

0

docs :

현재 브로드 캐스트 리시버를 실행하는 과정을 전경 프로세스로 간주 (즉 현재의 onReceive (맥락에서 코드 텐트) 메소드를 실행한다) 과도한 메모리 압력이있는 경우를 제외하고는 시스템을 계속 실행합니다 ( ).

그런 다음

이 더 이상 실행 작업은 종종 작업의 전체 시간 동안 활성 포함하는 과정을 유지하는 브로드 캐스트 리시버와 연계하여 서비스를 사용하는 것을 의미합니다.

그래서 수신기의 프로세스가 높은 우선 순위를 가지며 따라서 계속 실행되도록 수신기를 등록하는 서비스를 구현해야합니다.

+0

어떻게 안드로이드에서 ACTION_TIME_CHANGED 방송을 듣고 끝없는 서비스를 시작할 수 있습니까? @Mina Samy – maryBlaa

+0

응용 프로그램을 강제 종료하면 프로세스가 종료되므로 응용 프로그램의 프로세스가 다시 라이브에 있지 않으면 수신기에서 이벤트를 수신 할 수 없습니다. 사용자가 의도적으로 앱을 강제 종료하려고하므로 정상적인 동작입니다. 여기서 해결 방법은 http://stackoverflow.com/a/21551045/235123에 설명되어 있습니다. 여기서 응용 프로그램이 강제 종료 된 경우에도 프로세스를 유지할 수 있습니다. –

관련 문제