简体   繁体   English

在 Android 应用程序中使用 BROADCAST RECEIVER 自动重启时在上下文中获取 NULL

[英]Getting NULL in context while auto restart with BROADCAST RECEIVER in Android app

I am developing android application which need auto restart when restart device for that I am using broadcast receiver with action BOOT_COMPLETED.我正在开发 android 应用程序,该应用程序需要在重启设备时自动重启,因为我正在使用具有操作 BOOT_COMPLETED 的广播接收器。

Broadcast receiver is receiving message when I am restarting device but in restart method I want to start main activity for that I used Intent but in onReceive method of receiver I am getting null context so I am unable to restart main Activity.当我重新启动设备时,广播接收器正在接收消息,但在重新启动方法中我想启动主要活动,因为我使用了 Intent,但在接收器的 onReceive 方法中,我得到 null 上下文,所以我无法重新启动主要活动。

Below is code for that.下面是代码。

MainActivity.java MainActivity.java

private Object activity;
private TextView tvImeiNum;
private BroadcastReceiver rebootreceiver;
private IntentFilter filter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    tvImeiNum = (TextView)findViewById(R.id.tv_imeinum);

     filter = new IntentFilter();
    filter.addAction(Intent.ACTION_BOOT_COMPLETED);
    filter.addAction(Intent.ACTION_REBOOT);



    rebootreceiver = new BootUpReceiver(MainActivity.this);

    LocalBroadcastManager.getInstance(this).registerReceiver(rebootreceiver, 
filter);//registering receiver


    generateUniqueCode();
}

BootupReceiver.java BootupReceiver.java

    public class BootUpReceiver extends BroadcastReceiver {

        MainActivity ma;
        public BootUpReceiver(MainActivity maContext){
            ma=maContext;
        }

        public BootUpReceiver(){
        }

        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
                Log.d("TAG REBOOT", "onReceive: " + intent);
                Log.d("Reboot complete", "connection");

                GlobalTool.restartApplication(context);

            }
        }
    }

GlobalTool.java GlobalTool.java

    public class GlobalTool {

        @RequiresApi(api = Build.VERSION_CODES.M)
        public static void restartApplication(Context context) {
    

            Log.d("IN App restart:", "");


            Log.d("TAG", "restartApplication: ");
            if(context != null)
            {
                Log.d("TAG NULL", "restartApplication: ");
                Intent mainIntent = new Intent(context, MainActivity.class);

                AlarmManager alarmMgr = (AlarmManager) 
context.getSystemService(ALARM_SERVICE);
                TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
                stackBuilder.addNextIntent(mainIntent);
                PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, 
PendingIntent.FLAG_UPDATE_CURRENT);

                long alarmTime = System.currentTimeMillis() + (1 * 1000);
                alarmMgr.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
                Log.d("TAG", "restartApplication: 111");
                Log.d("TAG", "restartApplication: 111");

            }
            else {
                Intent mainIntent = new Intent(context, MainActivity.class);

                AlarmManager alarmMgr = (AlarmManager) 
context.getSystemService(ALARM_SERVICE);
                TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
                stackBuilder.addNextIntent(mainIntent);
                PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, 
PendingIntent.FLAG_UPDATE_CURRENT);

            long alarmTime = System.currentTimeMillis() + (1 * 1000);
            alarmMgr.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
            Log.d("TAG", "restartApplication: 111");
            Log.d("TAG", "restartApplication: 111");
        }
    }

}

AndroidManifest.xml AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.kioskappdemo">

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

<application
        android:name="KioskApplication"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.KioskAppDemo"
        tools:targetApi="31"
        tools:ignore="Instantiatable">
        <service
            android:name=".RebootService"
            android:enabled="true"
            android:exported="true"></service>

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category 
android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".Activity.BootUpReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter >
                <action 
android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.REBOOT" />
                <action 
android:name="android.intent.action.QUICKBOOT_POWERON" />
                <action android:name="com.reboot.test" />
                <action 
android:name="android.intent.action.TIMEZONE_CHANGED" />
                <action 
android:name="android.intent.action.DATE_CHANGED" />


            </intent-filter>
        </receiver>
    </application>

</manifest>

Some you code improvements:一些代码改进:

  1. Don't put context to Brodcast Receiver constructor.不要将上下文放入 Brodcast Receiver 构造函数。 Use the Context from onReceive method使用 onReceive 方法中的上下文
    public class BootUpReceiver extends BroadcastReceiver {
        public BootUpReceiver(){
           //TODO log
        }
    ...
  1. You should not use LocalBroadcastManager::registerReceiver call.您不应使用 LocalBroadcastManager::registerReceiver 调用。 If Broadcast receiver is added to AndroidManifest then it will be started by the system.如果将广播接收器添加到 AndroidManifest 中,那么它将由系统启动。
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <receiver
        android:name=".activity.BootUpReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter >
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
  1. Don't use CamelCase for package names (use.activity.BootUpReceiver insetad.Activity.BootUpReceiver)不要将 CamelCase 用于 package 名称(use.activity.BootUpReceiver insetad.Activity.BootUpReceiver)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM