2011-08-13 4 views
7

나는이 문제에 관한 12 개의 튜토리얼과 포럼 답변을 쏟아 부었지만 여전히 작동 코드를 함께 얻을 수 없었다. 질문을 간단하게 유지하려고 노력할 것입니다 :Android에서 AlarmManager로 활동을 시작하려면 어떻게해야합니까?

AlarmManager (Android API에서)를 사용하여 주어진 시간에 활동을 어떻게 시작합니까? 이 문제에 대한 해결책이 있습니다.

이것을 달성하기위한 최근의 시도는 다음과 같습니다.

(생략 수입. 나는 프로그램이 그것. 이야기하는 오류 메시지가없는이 없습니다 않는, 열린 후 MyActivity 3을 시작할 것으로 기대합니다.)

public class AndroidTest2Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Context context = this;//.getApplicationContext(); 

     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // CORRECT 
     Intent intent = new Intent(context, myReceiver.class); // CORRECT 
     PendingIntent pending = PendingIntent.getBroadcast(context, 0, intent, 0); // CORRECT 
     manager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pending); // CORRECT 

     setContentView(R.layout.main); 
    } 
} 

public class myReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Intent i=new Intent(context, myActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 

public class myActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("", "Elusive success"); 
     setContentView(R.layout.main); 
    } 
} 

어떤 조언을 주시면 감사하겠습니다.

참고 : 나는 이미

+2

AndroidManifest에 수신기를 등록하셨습니까? –

+0

죄송합니다. 언급 했어야합니다. 라인을 사용하여 예. 그것이 잘못된 선인지 알려주세요. – BenLambell

답변

0

그런 다음

"myReceiver" to "MyReceiver" and "myActivity" to "MyActivity". 

을 변경 같은 매니페스트 파일에 수신기를 추가 자본 letter.So로 시작 자바 컨벤션 클래스 이름에 따르면 매니페스트에 myReceiver있어 아래에.

<application 
------------ 
<receiver android:name="MyReceiver"></receiver> 
--------------------- 
</application> 
+0

중요한 경우를 대비하여 올바른 Java 규칙을 채택했습니다. 이미 매니페스트에서 올바른 라인을 사용하고 있습니다. (필자는 안드로이드로 .MyReceiver 및 MyReceiver를 사용해 보았습니다 : 이름 - 내가 본 것 중 하나 인 것처럼 보입니다). 어쨌든이 방법으로 문제가 해결되지는 않지만 의견을 보내 주셔서 감사합니다. – BenLambell

4

어떻게 당신은 주어진 시간에 활동을 시작하는 (안드로이드 API)에 알람 관리기를 사용합니까?

시작할 활동을 식별하는 PendingIntentset() 호출에 제공하십시오. 또는 당신이하고있는 일을하십시오. 잘 작동합니다. 그것은 깊은 내 책 중 하나에 19 튜토리얼이기 때문에

This sample project는 조금 정교한이지만 EditPreferences, OnBootReceiverOnAlarmReceiver 같은 클래스를 보면, 당신은 당신이 위의 사용하고있는 동일한 기본 레시피를 볼 수 있습니다. 이 경우 방금 getActivity()PendingIntent을 사용할 수 있었지만이 튜토리얼 이후에는 사용자가 액티비티를 시작하거나 Notification을 표시하도록 선택할 수 있으므로 BroadcastReceiver이 더 적합합니다.

LogCat의 오류 외에도 경고를 찾으십시오. 대개 수신자 또는 활동이 매니페스트에 없습니다.

중간에 활동을 포착하는 것은 일반적으로 좋지 않습니다. 문제의 책에서 자신을 인용 :

전체 화면 활동을 통해 점심 시간에 알람을 표시 확실히 을 작동하고 사용자가 화면을보고 있다면, 그것은 그들의 관심을 얻을 것이다. 그러나 인스턴트 메시지는 인스턴트 인스턴트 메시지를 사용하는 경우에는 다소 혼란 스럽습니다. 예를 들어 운전 중 문자 메시지를 입력하는 경우 알람 활동이 갑자기 나타나면 우연히 사고로 이어질 수 있으므로 으로 안내 할 수 있습니다. 따라서 공공 안전을 위해 에 점심 식사를 생각 나게하는 미묘한 방법을 사용자에게 제공해야합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. - 실제로 자습서를 보았습니다. 대체하려고 시도했습니다 의도 의도 = 새 의도 (context, MyActivity.class); // CORRECT PendingIntent 보류 = PendingIntent.getActivity (context, 0, intent, 0); // CORRECT – BenLambell

+1

죄송합니다. 다시 시도하겠습니다 : – BenLambell

+0

빠른 응답을 보내 주셔서 감사합니다. - 실제로 자습서를 보았습니다 (수신기를 목록에 넣었습니다). 시도해 보았습니다 \t 의도 의도 = 새로운 의도 (context, MyActivity.class); PendingIntent pending = PendingIntent.getActivity (context, 0, intent, 0); \t 여전히 MyActivity가 실행되고 있다는 증거는 없습니다.그러나, 다음과 같은 로그 메시지가 나타납니다 : \t (ActivityManager) 시작 : 의도 (pid에서 0,04 cmp = com.ben/.MyActivity (엑스트라 포함)) – BenLambell

5

누군가 다른 사람이이 문제에 직면 한 경우 - 여기에 몇 가지 작동 코드가 있습니다 (2.3에서 테스트되었습니다.3 에뮬레이터) :

public final void setAlarm(int seconds) { 
    // create the pending intent 
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); 
    // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, 
      intent, 0); 
    // get the alarm manager, and scedule an alarm that calls the receiver 
    ((AlarmManager) getSystemService(ALARM_SERVICE)).set(
      AlarmManager.RTC, System.currentTimeMillis() + seconds 
        * 1000, pendingIntent); 
    Toast.makeText(MainActivity.this, "Timer set to " + seconds + " seconds.", 
      Toast.LENGTH_SHORT).show(); 
} 

public static class AlarmReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Log.d("-", "Receiver3"); 
    } 
} 

의 AndroidManifest.xml :

<receiver android:name="com.example.test.MainActivity$AlarmReceiver" > 
    </receiver> 

BenLambell의 코드 문제 :

  • 중 하나
    • 이동 그 자체가 된 .java 파일에 수신기 또는
    • 내부의 cl 만들기 정적 엉덩이 - 그래서 외부
  • 리시버는 매니페스트에 올바르게 선언되지 않았습니다에서 액세스 할 수 있습니다
    • 는 MainActivity 사용의 내부 클래스 인 경우 : 그것은 별도의 파일에 있는지 <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • 가 : 당신의 의도가있는 대화 상자를 표시합니다 <receiver android:name="package.name.AlarmReceiver" ></receiver>

경우 리시버의 onReceive (나 같은) : 허용되지 않습니다 - 대화 만 시작할 수 있습니다. 이것은 dialog activity으로 얻을 수 있습니다.

직접 알람 관리기와 활동 호출 할 수 있습니다

Intent intent = new Intent(MainActivity.this, TriggeredActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + seconds * 1000, pendingIntent); 
1

는 안드로이드 mainifest 파일이 추가하고 잘하면 당신이 수신기에 대한 어떤 방송을 전송하지 않는

<activity android:name=".MyReceiver" /> 
     <receiver android:name=".MyReceiver"> </receiver> 
0

작동됩니다 수신기 및 더 이상 그것처럼 lokks U는 스플래시 화면이나 그런 목적을 위해 그런 걸 좋아해요 u는 새로운 스레드를 시작할 수 있습니다 몇 초 다음에 그 시작 ur 활동을 그 기간 동안 u는 UI에서 원하는 일을 할 수 있습니다 스레드 ...

관련 문제