Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我的应用程序关闭时,当引用另一个类中的静态方法时,扩展BroadcastReceiver的类中的字符串将返回null_Java_Android_Static_Broadcastreceiver_Alarmmanager - Fatal编程技术网

Java 当我的应用程序关闭时,当引用另一个类中的静态方法时,扩展BroadcastReceiver的类中的字符串将返回null

Java 当我的应用程序关闭时,当引用另一个类中的静态方法时,扩展BroadcastReceiver的类中的字符串将返回null,java,android,static,broadcastreceiver,alarmmanager,Java,Android,Static,Broadcastreceiver,Alarmmanager,我正在创建一个具有短信发送功能的应用程序。我目前遇到一个问题,涉及调用扩展BroadcastReceiver的类的AlarmManager(功能正常)。使用AlarmManager的类是MainMenu.class,扩展BroadcastReceiver的类是AlarmReceiver.class 在MainMenu类中,用户输入电话号码和信息。在AlarmReceiver类中,我试图通过访问getPhoneNumber()方法和getMessage()方法来发送sms。当我这样做并且应用程序关

我正在创建一个具有短信发送功能的应用程序。我目前遇到一个问题,涉及调用扩展BroadcastReceiver的类的AlarmManager(功能正常)。使用AlarmManager的类是MainMenu.class,扩展BroadcastReceiver的类是AlarmReceiver.class

在MainMenu类中,用户输入电话号码和信息。在AlarmReceiver类中,我试图通过访问getPhoneNumber()方法和getMessage()方法来发送sms。当我这样做并且应用程序关闭时,电话号码和消息都会返回null到AlarmReceiver类,即使它正在访问MainMenu类中的静态方法

以下是MainMenu.class中AlarmManager的代码:

int hours, minutes;

hours = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();

Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, hours);
cal.set(Calendar.MINUTE, minutes);

Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
intentAlarm.putExtra("phoneNumber", phoneNumber);
intentAlarm.putExtra("message", message);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),  PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
                                        PendingIntent.FLAG_CANCEL_CURRENT));
以下是AlarmReceiver类的代码:

public class AlarmReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Intent intentAlarm = new Intent();
        String phoneNumber = intentAlarm.getStringExtra("phoneNumber");
        String message = intentAlarm.getStringExtra("message");
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber,  null, message, null, null);
    }//end onReceive

}//end AlarmReceiver
我甚至尝试使用SharedReferences来记住电话号码和信息,但仍然返回空值

提前谢谢

我甚至尝试使用SharedReferences来记忆 电话号码和信息,但仍返回空值

无需使用
SharedReferences
static
方式从
Main菜单
class访问变量

您可以使用Intent从
主菜单
报警接收器
传递所需数据:

Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
intentAlarm.putExtra("phone_number",MainMenu.getPhoneNumber());

现在使用
phone\u number
键从
intent
获取电话号码,这是AlarmReceiver类的
onReceive
方法中的第二个参数。

Android可以随时终止您的进程。您当时拥有的任何内存变量(包括电话号码和信息)都将丢失。我们需要查看代码的其余部分才能确定,但将数据保存到SharedReferences对象可能是一个解决方案。@Marius我理解这一点,但不是每次我都这么做。我使用此AlarmManager的全部意义在于,我可以与之抗争,这样当应用程序关闭时,我可以在后台继续处理,这样就可以在计时器上发送短信,而不会让应用程序仍然打开。AlarmManager不打算将应用程序保留在后台。它用于设置将来触发的警报,即使应用程序未运行。如果你想让一个应用程序继续运行,你可以使用后台服务之类的东西;甚至是通知栏中的前台通知。然而,即使这样也不能保证。Android仍然可以在它认为必要的任何时候杀死你的应用程序。出于您的目的,没有必要将应用程序保留在后台;只需将您的数据持久化到SharedReferences或其他持久化存储,并将其加载到您的BroadcastReceiver中即可。我以前尝试过这种方法,但我尝试使用用于调用BroadcastReceiver的意图。无论是哪种方式,我都尝试使用完全不同的意图使用putExtra()传递字符串,但在AlarmReceiver类中它们仍然为空。@saboehnke:当使用
intentAlarm
intent传递数据时,您遇到了什么问题?并尝试使用
pendingent.FLAG\u CANCEL\u CURRENT
标志,而不是
pendingent.FLAG\u UPDATE\u CURRENT
当我使用不同的意图时,我会得到相同的错误。我发现我正在使用无效的目标地址和无效的消息。我测试发现它们都返回null。@saboehnke:为什么使用不同的意图?@saboehnke:如果可能,请更新您尝试使用意图发送数据的代码