使用应用

时间:2017-01-16 22:10:22

标签: android android-alarms android-broadcastreceiver

警报不起作用的程度变得不真实。我有两个问题,Android杀了我的应用程序,因此一切都停止,即使我读到的一切都说它应该工作。

我的AlarmManager项目在我绿化我的应用程序时死亡,Greenify给我就像让手机坐在那里并让Android杀死它一样。无论哪种方式,我都应该在提示中等待发出我的PwendingIntent。否则,RTC_WAKEUP对于警报设置有什么用处。

我的清单

<receiver
    android:name=".ContactAlarmReceiver"
    android:enabled="false"
    android:process=":alarmremote">
    <intent-filter>
        <action android:name="com.example.johnbravado.zionwork.CONTACTALARM" />
        <action android:name="com.example.johnbravado.zionwork.NOTIFLTBTN" />
        <action android:name="com.example.johnbravado.zionwork.NOTIFRTBTN" />
    </intent-filter>
</receiver>

我的接收者

@Override
public void onReceive(Context context, Intent intent) {
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    //throw new UnsupportedOperationException("Not yet implemented");
    //Toast.makeText(context, "Received Alarm", Toast.LENGTH_SHORT).show();
    Log.d("johnbravadoCAR ","received");
    PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            "com.example.johnbravado.zionwork");
    wakeLock.acquire();

    ComponentName component = new ComponentName(context, ContactAlarmIntentService.class);
    context.getPackageManager()
            .setComponentEnabledSetting(component,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);

    Intent alarmIntent = new Intent(context, ContactAlarmIntentService.class);
    alarmIntent.putExtras(intent.getExtras());
    alarmIntent.setAction(intent.getAction());
    context.startService(alarmIntent);
    wakeLock.release();
}

我知道清单中有android:enabled="false"。在设置闹钟之前,我用PackageManager调用来计数。见下文

private void setAlarm() {
    //ContactAlarmReceiver contactAlarmReceiver = new ContactAlarmReceiver();
    //contactAlarmReceiver.setAlarm(getApplicationContext(), dateInMillis, phonenumberET.getText().toString(), firstnameET.getText().toString());

    ComponentName component = new ComponentName(this, ContactAlarmReceiver.class);
    getPackageManager()
            .setComponentEnabledSetting(component,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent alarmIntent = new Intent(MyConstants.BROADCAST_ACTION_CONTACT_ALARM);
    alarmIntent.putExtra("phone", phonenumberET.getText().toString());
    alarmIntent.putExtra("name", firstnameET.getText().toString());

    PendingIntent pi = PendingIntent.getBroadcast(this, 123456, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (Build.VERSION.SDK_INT >= 23) {
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    } else if (Build.VERSION.SDK_INT >= 19) {
        am.setExact(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    } else {
        am.set(AlarmManager.RTC_WAKEUP, dateInMillis, pi);
    }
}

一旦我将闹钟设置为超过30分钟的时间,或者如果我在3分钟后设置闹钟并且Greenify我的应用程序,我在logcat查看器中看不到Log.d打印出来。从我能阅读和理解的内容中,AlarmManager应该触发我的BroadcastReceiver并开始工作。

如果我让这个工作,我会写一个详细的解释,所以其他人不会经历同样的事情。如果这个shoudl工作,是否有一些设置可能会杀死与我的应用程序的关联,我需要取消选中?

更新

这段代码很扎实。我遇到了一个二级应用程序Greenify的问题,除了我的直接交互之外,它已经以某种方式打开了。该应用程序在屏幕关闭时杀死了我的应用程序。告诉Greenify不要触摸我的应用程序后,此代码将根据需要执行。从好的方面来说,我学到了很多关于BroadcastReceiver,AlarmManager和Service实现的知识,因为我尝试了10种不同的方法来解决我用代码无法解决的问题。

1 个答案:

答案 0 :(得分:0)

Greenify正在杀死我的申请。请参阅OP中的更新