【问题标题】:Pending Intent Causing mainactivity to reload, why is that?Pending Intent 导致 mainactivity 重新加载,这是为什么呢?
【发布时间】:2016-06-11 04:33:30
【问题描述】:

我正在尝试编写一个服务,该服务将在每个午夜检查来自服务器的新数据并下载它。

但是当我启动应用程序时,mainActivity 屏幕会在几秒钟后重新加载。 我已经检查过了,它是因为这项服务而发生的, 为什么会这样?

她是文件:

MainActivity: 我创建了一个 AlarmManager 对象来设置 pendingIntent:

//Set alarm
    /* Retrieve a PendingIntent that will perform a broadcast */
    Intent alarmIntent = new Intent(getApplicationContext(), AlarmReciever.class);
    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    int interval = 1000 * 24 * 60 * 60;

    /* Set the alarm to start at 10:30 AM */
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 00);
    calendar.set(Calendar.MINUTE, 00);
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

AlarmReciever:

public class AlarmReciever extends BroadcastReceiver {
    private Data newData = null;
    public SharedPreferences settings;
    ConnectivityManager cm = null;
    NetworkInfo netInfo = null;

    @Override
    public void onReceive(Context context, Intent intent) {

        newData = new Data(context);

        // TODO Auto-generated method stub
        newData.cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        newData.netInfo = newData.cm.getActiveNetworkInfo();
        newData.settings = PreferenceManager.getDefaultSharedPreferences(context);
//        System.out.print("-----------------" + newData.netInfo);
        newData.checkOnline();
    }
}

Data.java:

    public void checkOnline(){
    if (isOnline()){
        System.out.print("**************** YES Internet");
        firstAsyncTask task = new firstAsyncTask(this);
        try {
            Object dobj = task.execute("par1", "par 2", "par 3").get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }else{
        System.out.print("**************** NO Internet");
    }
}

data.java 文件太大,无法在此处发布,但似乎“checkOnline”方法导致应用重新加载 MainActivity 页面,我应该以不同的方式发送服务吗?

感谢阅读和回答。

【问题讨论】:

    标签: java android android-pendingintent android-alarms


    【解决方案1】:

    这行好像写错了

    pendingIntent = PendingIntent.getService(getApplicationContext(), 0, alarmIntent, 0);

    应该是这样的

    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

    因为您使用的是 BroadcastReciever。

    【讨论】:

    • 是的,很抱歉,我修复了它,它仍然在发生
    • 根据您的代码,不知道为什么会发生这种情况
    【解决方案2】:

    导致以下线路网络访问?

    Object dobj = task.execute("par1", "par 2", "par 3").get();
    

    如果是这样,那么系统可能会终止您的进程(以太网用于主线程上的网络或事件循环超时,又名 ANR)。如果它是一个服务,最终会再次重新启动它。

    【讨论】:

      【解决方案3】:

      在您的Activity 中,您可以这样做:

      manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
      

      这会导致立即触发BroadcastReceiver,因为您已将System.currentTimeMillis() 指定为第一次触发的时间。

      您的意思可能是第一次使用calendar.getTimeInMillis() 来触发警报。但即使您将其更改为,它仍然会立即触发,因为您已将日历中的时间设置为 当天 的 00:00,这已经通过了!您需要使用calendar.getTimeInMillis() + interval(即第二天的00:00,或者您可以在使用calendar.getTimeInMillis()之前将1天添加到您的日历中。

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 1970-01-01
        • 2017-11-07
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-13
        相关资源
        最近更新 更多