4

アラームに添付されたテキスト文字列に問題があります。アラームがトリガーされると、アラームに付けられた文字列が null になっているようです。明らかに私は間違いを犯しました - しかし、どこにあるのかわかりません。

アラームを設定するための私のコードは次のとおりです。

static void set_alarm(long alarm_time_in_millis,Context cont,AlarmManager alarm_manager,String str)
{
    Intent intent = new Intent(cont, to_call_when_alarm_goes_off.class);
    intent.putExtra("string_passed_in_bundle", str); 

    Log.i("xx","set_alarm ["+str+"]"); // The string I see in the Log is correct
    PendingIntent pIntent = PendingIntent.getBroadcast(cont,0, intent, 0);

    alarm_manager.cancel(pIntent);

    alarm_manager.set(AlarmManager.RTC_WAKEUP,alarm_time_in_millis, pIntent);
}

アラームを受信するコードは次のとおりです。

public class to_call_when_alarm_goes_off extends BroadcastReceiver
{
    Bundle bundle_from_whoever_called_this_activity;

    @Override
    public void onReceive(Context arg0, Intent arg1) 
    {
        String str;

        bundle_from_whoever_called_this_activity = arg1.getExtras();

        str = bundle_from_whoever_called_this_activity.getString("string_passed_in_bundle");

        Log.i("xx","to_call_when_alarm_goes_off: TIME TO WAKE UP!!! ["+str+"]");

        try 
        {
            Intent i = new Intent(arg0, dingaling.class);
            i.putExtra("string_passed_in_bundle", str);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            arg0.startActivity(i);
        } 
        catch (Exception e) 
        {
        }
    }
}

アラームを設定してトリガーされるのを待つと、ログファイルには次のように表示されます

set_alarm [Go to meeting]
to_call_when_alarm_goes_off: TIME TO WAKE UP!!! [null]

編集:「スーパー」があるかもしれません。呼び出すのを忘れた関数?

編集: getBaseContext()、getApplicationContext()、「this」など、さまざまな関数に渡すコンテキストの種類についてよく混乱します...どこかに間違った種類のコンテキストが含まれていると、この問題が発生する可能性がありますか?

4

5 に答える 5

2

コードをコピーしてアプリケーションに貼り付けるだけで、完全に機能しています。オン アクティビティを作成し、ブロードキャスト レシーバーをコピーするだけです。アクティビティのボタンを 1 つ取り、ボタンの onCLick で setAlarm の関数を呼び出します。

ブロードキャストレシーバーで文字列を取得できます。

これが私のコードです。

 public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

                set_alarm(System.currentTimeMillis(), MainActivity.this, manager, "Time for tea");
            }
        });
    }


    static void set_alarm(long alarm_time_in_millis,Context cont,AlarmManager alarm_manager,String str)
    {
        Intent intent = new Intent(cont, to_call_when_alarm_goes_off.class);
        intent.putExtra("string_passed_in_bundle", str); 

        Log.i("xx","set_alarm ["+str+"]"); // The string I see in the Log is correct
        PendingIntent pIntent = PendingIntent.getBroadcast(cont,0, intent, 0);

        alarm_manager.cancel(pIntent);

        alarm_manager.set(AlarmManager.RTC_WAKEUP,alarm_time_in_millis, pIntent);
    }
}

放送受信機はあなたのものと同じなので、ここには入れません。

最後に、マニフェストでブロードキャスト レシーバーを宣言します。

出力

set_alarm [Time for tea]
to_call_when_alarm_goes_off: TIME TO WAKE UP!!! [Time for tea]
于 2012-07-26T05:29:07.483 に答える
1

以下のコードは私のために働いた。AndroidManifest のインテント フィルターを使用してカスタム インテントを介して BroadcastReceiver を呼び出しています。しかし、なぜそれが違いを生むのか、私は本当に言うことはできません. そうは言っても、以下のコードは機能します。

public class MainActivity extends Activity implements OnClickListener {
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.button1);
    button.setOnClickListener(this);
}

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
        setAlarm();
        break;
    }       
} 

private void setAlarm() {
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    long interval = System.currentTimeMillis() + 10000; // 10 seconds from now
    Intent launchIntent = new Intent();
    launchIntent.putExtra("your_key", "your string value");
    launchIntent.setAction(MyBroadcastReceiver.CUSTOM_INTENT);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, launchIntent, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP,interval,
            pendingIntent);     
}
}

そしてBroadcastReceiver:

public class MyBroadcastReceiver extends BroadcastReceiver {
public static final String CUSTOM_INTENT = "com.your_custom_intent";

@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    String message = bundle.getString("your_key");
    Log.d("test", message);
}
}

そして AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test2_2"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name=".MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.your_custom_intent" />
        </intent-filter>
    </receiver>
</application>

</manifest>
于 2012-07-21T05:09:20.797 に答える
1

このコードを実行して、取得している文字列が期待どおりであることを確認してください。私はあなたが期待しているものを得ていないに違いない.

于 2012-07-18T15:39:44.647 に答える
1

からキーを変更すると、

"string"

"alarm_string"

to_call_when_alarm_goes_off クラスでまだ文字列を取得していますか? それともnullになりますか?

ここで cancel(pIntent) 関数を削除するとどうなりますか:

alarm_manager.cancel(pIntent);

alarm_manager.set(AlarmManager.RTC_WAKEUP,alarm_time_in_millis, pIntent);

ノイズを減らそうとするだけです。「string」はシリアル化などで使用されている可能性があり、混乱している可能性があります。よりユニークな値も役立ちます。

于 2012-07-19T15:13:16.823 に答える
1

Intentその の代わりに を使用するBundleので...

str = arg1.getStringExtra("string");
于 2012-07-18T20:25:28.927 に答える