2012-07-18 54 views
4

我遇到了连接到警报的文本字符串的问题。看起来,当警报被触发时,连接到警报的字符串是空的。很明显,我犯了一个错误 - 但不知道在哪里。警报管理器中的字符串丢失

我的设置闹钟的代码是;

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”等...如果我在某个地方涉及到错误类型的上下文,是否会导致此问题?

+0

第一个日志声明(XX)具有正确的字符串广播接收器,我把它?另外,你可以尝试将你的额外关键字重命名为比“字符串”更独特的标识吗?我怀疑这是问题,但你永远不知道.. – Scen 2012-07-18 15:39:05

+0

@Scen:是的第一个日志有正确的字符串 - 好吧我会尝试一些比“字符串”以外的东西。 – Mick 2012-07-18 15:46:17

+0

@Scen:从使用“string”改为“alarm_string”,但没有区别。 – Mick 2012-07-18 15:56:16

回答

1

您可能希望逐步通过此代码,并确保您得到的字符串是您所期望的。我敢打赌,你没有得到你所期望的。

1

使用Intent而不是其Bundle,所以......

str = arg1.getStringExtra("string"); 
+0

如果我使用该方法,变量str为空:-( – Mick 2012-07-19 09:57:12

1

当您更改

"string" 

"alarm_string" 

关键你还得到一个字符串在to_call_when_alarm_goes_off类中?或者你得到空?

,如果你在这里删除取消(pIntent)功能会发生什么:

alarm_manager.cancel(pIntent); 

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

只是想减少噪音。 “串”可能用于序列化或其他什么,它可能会变得困惑。更独特的价值也有帮助。

+0

我现在使用“string_passed_in_bundle”而不是“string”。我现在在我的广播接收器中接收到null。我试着注释掉cancel()没有区别 - 仍为空 – Mick 2012-07-20 09:34:03

+0

我已编辑原始问题以反映最新版本 – Mick 2012-07-20 09:38:38

1

以下代码适用于我。我使用AndroidManifest中的intent过滤器通过自定义意图调用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);  
} 
} 

而且广播接收器:

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> 
2

我只是复制并粘贴在我的应用程序代码,它是可以正常使用。只需创建活动并复制您的广播接收器。在活动中按一个按钮,按钮的onCLick调用setAlarm的函数。

我能够在broadcastReceiver中获取字符串。

这是我的代码。作为你的,所以我没有把它在这里

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]