簡體   English   中英

應用程序從后台刪除時,廣播接收器無法正常工作?

[英]Broadcast Receiver is not working when application is removed from background?

我試圖在我的移動應用程序中運行此代碼,但它沒有運行,也沒有給出任何錯誤。 我也試過打印日志,但它沒有在logcat中顯示任何內容。 此問題僅發生在Oreo中,並且在所有其他Android版本中運行良好,在應用程序處於后台時運行良好。

public class MainActivity extends AppCompatActivity {

   AlarmManager am;
    TimeAlarm timeAlarm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        setOneTimeAlarm();
    }

    public void setOneTimeAlarm() {
        Intent intent = new Intent(this, TimeAlarm.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5 * 1000), pendingIntent);
    }

    public void setRepeatingAlarm() {
        Intent intent = new Intent(this, TimeAlarm.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), (5 * 1000), pendingIntent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("ondestroy","ondestroy");

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("onstart","onstart");

        IntentFilter intentFilter=new IntentFilter("my.custom.action.tag.fordemo");
        intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
        registerReceiver(timeAlarm,intentFilter);
    }
}

代碼廣播接收器,當我從后台刪除應用程序時,它停止工作。

public class TimeAlarm extends BroadcastReceiver {

    NotificationManager nm;
    String channelId = "channel-01";
    String channelName = "Channel Name";
    int importance = NotificationManager.IMPORTANCE_HIGH;

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onReceive(Context context, Intent intent) {
    nm = (NotificationManager) 
    context.getSystemService(Context.NOTIFICATION_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel mChannel = new NotificationChannel(
                        channelId, channelName, importance);
                nm.createNotificationChannel(mChannel);
            } else {

            }
            CharSequence from = "Nithin";
            CharSequence message = "Crazy About Android...";
            PendingIntent contentIntent = 
            PendingIntent.getActivity(context, 0, new Intent(), 0);
            //Notification notif = new Notification(R.drawable.logo, 
           "Crazy About Android...", System.currentTimeMillis());
            NotificationCompat.Builder notification = new 
            NotificationCompat.Builder(context.getApplicationContext());
            // notification.setContentIntent(pintent);
       notification.setTicker(from).setSubText(from).setSmallIcon(R.drawable.logo);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                notification.setChannelId(channelId);
            }

            Notification notification1 = notification.build();
            notif.setLatestEventInfo(context, from, message,contentIntent);
            nm.notify(1, notification1);
        }
    }        

它在任何版本的操作系統的后台應該不起作用。 您正在onStart中注冊接收器,然后在onStop中取消注冊。 這意味着在處理onStop之后,OS的接收器不存在。 如果您看到它在其他版本的操作系統上運行,那實際上就是一個錯誤。

當然,您的broadcast在您的申請被關閉時被殺死。 如果您在onStop / onDestroyed unregisterReceiver onDestroyed ,則會出現泄漏問題。 為避免這種情況,您應該實現一個Service (並在您的服務中調用registerReceiver(timeAlarm,intentFilter);即使您的應用程序關閉,它也會在后台運行)。

P / s:記得startForeground以防止服務在Android 8.0或更高版本中被系統殺死。

您必須在清單中添加警報權限

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

還要注冊你的廣播

    <receiver
        android:name=".broadcast.ServiceBroadcast"
        android:enabled="true"
        android:exported="true"
        android:label="RestartServices">
        <intent-filter>
        <action android:name="restart_services"/>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM