2012-02-04 4 views
2

사용자 정의 연결 클래스 (스레드 확장)를 사용하는 서비스가 하드웨어 컨트롤러에 있습니다. 사용자가 선호하는 경우이 연결을 영구적으로 유지하고자합니다. Android 기기가 인터넷 연결이 끊어 지거나 Wi-Fi 등으로 전환 될 때 처리 할 코드가 이미 있습니다.알람 관리자와 내부 브로드 캐스트 수신기가있는 안드로이드 장기 실행 서비스

연결 상태를 유지하려면 컨트롤러에서 5 분마다 통화해야합니다. 저는 현재 Connection 클래스 내에서 while()으로 실행되는 스레드를 시작하고 시스템 시간과 마지막으로 통신 한 시간을 확인하고> 4 분이 지나면 상태를 요청합니다. 어떤 이유로, 서로 다른 시간에 의사 소통이 시간 내에 발생하지 않습니다. 즉, 5 분 후에 발생한다. 내가 알 수있는 한 서비스는 죽지 않지만 컨트롤러에 대한 "Ping"은 늦습니다. 휴대 전화를 충전기 (또는 디버거)에 꽂으면 발생하지 않습니다. 또한 서비스를 포 그라운드로 이동하면 동작이 동일합니다.

수면 모드로 전환 할 때 휴대 전화의 프로세서 속도가 느려 집니까?

더 좋은 방법이 있습니까?

저는 AlarmManger라고 생각합니다.하지만 서비스 내에서 내부 클래스와 작동하도록하는 데 문제가 있습니다. API 데모를 시작하려했지만 브로드 캐스트 수신기를 등록하는 방법을 알아낼 수 없습니다. 매니페스트를 변경하지 않고 프로그래밍 방식으로 수신기를 등록하려고합니다. 가 절전 모드로 전환 할 때

public class DeviceConnectionService extends Service { 

    @Override 
    public void onCreate() { 
     Intent intent = new Intent(this, PingConnection.class); 
     intent.setAction("KEEP_CONNECTION_ALIVE"); 
     PendingIntent sender = PendingIntent.getBroadcast(this, 
      0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     // We want the alarm to go off 30 seconds from now. 
     long firstTime = SystemClock.elapsedRealtime(); 
     firstTime += 15*1000; 
     // Schedule the alarm! 
     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
     am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
       firstTime, 15*1000, sender); 
     // register to listen to the Alarm Manager 
     if (mPingConnectionReceiver == null) { 
      mPingConnectionReceiver = new PingConnection(); 
      getApplicationContext().registerReceiver(mPingConnectionReceiver, 
      new IntentFilter("KEEP_CONNECTION_ALIVE")); 
     } 
    } 

    // ... 

    public class PingConnection extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (dBug) Log.i("PingConnection", "Pinging Controller"); 
      // do real work here 
     } 
    } 
} 

답변

5

전화는 그것의 프로세서 속도를 느리게합니까?

휴대 전화는 절전 모드로 들어가면 프로세서를 종료합니다. 그것이 "수면"의 정의입니다.

저는 AlarmManger라고 생각합니다.하지만 서비스 내에서 내부 클래스와 작동 시키려면 문제가 있습니다. API 데모를 시작하려했지만 브로드 캐스트 수신기를 등록하는 방법을 알아낼 수 없습니다. 매니 페스트를 변경하지 않고 프로그래밍 방식으로 수신기를 등록하려고합니다.

이는 AlarmManager의 일반적인 방법입니다. 즉, "문제가 있다고"설명하는 것을 거부 했으므로 도움을 받기가 어렵습니다.

getApplicationContext()을 제거하십시오. (이 경우에는 필요 없으며 실제로 원하지 않습니다.) AlarmManager을 만지기 전에 수신기를 등록합니다. 프로덕션으로 이동하기 전에 패키지 이름이 들어있는 작업 이름 (예 : com.something.myapp.KEEP_CONNECTION_ALIVE)을 선택하십시오.

그 외에도 LogCat에서 경고를 확인하십시오.


UPDATE 당신의 로그 캣에서

을, 당신은 당신의 BroadcastReceiver 이야기 할 수 없다는 불평 AlarmManager에서 경고를해야한다.

Intent intent = new Intent(this, PingConnection.class); 
intent.setAction("KEEP_CONNECTION_ALIVE"); 

로 :

는 교체

Intent intent = new Intent("KEEP_CONNECTION_ALIVE"); 

당신은 더 좋은 행운이있을 수 있습니다.

+0

말썽이 = 발포하지 말라 – tunneling

+0

@tunneling : 응답에 갱신을보십시오. – CommonsWare

+0

그게 전부입니다. 설명 할 수 있니? – tunneling

0

서비스에 AlarmManager를 등록 할 수 없습니다. Manifest.xml에서 전역으로 선언 할 수 있습니다. Manifest.xml에서 선언하여 서비스에서 알람을 시작할 수 있습니다.

원격 서비스가 있고 실행 프로그램 활동을 닫으면 AlarmManager가 실행되지만 중지하는 것을 잊지 마십시오 서비스의 onDestroy() 메소드.

저는 AlarmManager를 Service에 등록하려고했지만, 주된 활동에는 사용하지 않았지만 성공하지 못했습니다! 정상적인 BroadCastReceiver로 등록하지 않았습니다. 일들이 방법

, 당신은 내가 늦게 알고 글로벌

0

로 Manifest.xml에 선언해야하지만, 어쩌면 다른 사람이 유용합니다.

등록 할 수 있습니다. 문제는 의도가 전화를 걸 때입니다.

대신 이런 식으로 호출의 :

Intent intent = new Intent(this, PingConnection.class); 

빈 의도를 작성하고 당신이 듣고가는 액션 추가

Intent intent = new Intent(); 
intent.setAction("value you want to register"); 

그런 다음 보류중인 의도를 생성하고 같은 브로드 캐스트를 보낼를 너는 그것을 가지고있다.

private PingConnection pingConnection = new PingConnection(); 

이처럼 등록이 전체 클래스에 액세스하고 필요한 경우합니다 (pendingIntent는 언제든지 등록을 취소 할 수있는 속성도있는 경우)의 등록을 취소 할 수 있습니다

수신기에 대한 속성을 만듭니다

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction("the value you used before"); 
getApplicationContext().registerReceiver(pingConnection, filter); 

오류가 발생하지 않으며 클래스가 정적이 아니며 내부 클래스입니다.

관련 문제