BOOT_COMPLETED не работает

#java #android

#java #Android

Вопрос:

Я хочу всегда запускать свое приложение для Android в фоновом режиме, например WhatsApp, truecaller, я использовал все, но при перезагрузке устройства приложение перестает работать в фоновом режиме, для этого я использовал широковещательный приемник для прослушивания загрузки. вот мой код.

Мой сервис

открытый класс Myservice расширяет сервис {

 File file;
private static String fileName = null;
private MediaRecorder recorder = null;
boolean mStartRecording = true;

@Override
public void onCreate() {
    super.onCreate();
}


@Override
public void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent("RestartService");



}

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {

    onTaskRemoved(intent);

    file = new File(Environment.getExternalStorageDirectory(), "pranay");
    if (!file.exists()) {
        boolean mkdir = file.mkdirs();

        if (!mkdir) {
            Toast.makeText(this, "Fialed", Toast.LENGTH_SHORT).show();
        }

    }
    fileName = Environment.getExternalStorageDirectory().getAbsolutePath()   "/pranay/"   UUID.randomUUID().toString()   "sample.mp3";
    Log.i("msg", "running");

    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent =
            PendingIntent.getActivity(this, 0, notificationIntent, 0);


    String channel = "pranay";
    NotificationChannel notificationChannel = new NotificationChannel("id", channel, NotificationManager.IMPORTANCE_NONE);
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    manager.createNotificationChannel(notificationChannel);


    Notification notification = new NotificationCompat.Builder(this, "id")
            .setContentTitle("sa")
            .setContentText("ssa")
            .setSmallIcon(R.drawable.ic_launcher_background)
            .setContentIntent(pendingIntent)
            .build();
    startForeground(1, notification);

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(fileName);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    TelephonyManager manager1 = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE);
    manager1.listen(new PhoneStateListener() {

        @Override
        public void onCallStateChanged(int state, String phoneNumber) {
            super.onCallStateChanged(state, phoneNumber);

            if (TelephonyManager.EXTRA_STATE_IDLE.equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE))) {
                cleanup();
            } else if (TelephonyManager.CALL_STATE_OFFHOOK == state) {


                try {
                    recorder.prepare();
                } catch (IOException e) {
                    Log.e("msg", "prepare() failed");
                }

                recorder.start();
                mStartRecording = true;
            }
        }
    }, PhoneStateListener.LISTEN_CALL_STATE);


    return super.onStartCommand(intent,flags,startId);
}

private void startForeground(Notification notification, String id) {

    startForeground(notification, id);
}
private void cleanup(){
    if(recorder!=null)
    {
        try {
            recorder.stop();
        }catch (Exception e){

            Log.e("msg",String.valueOf(e.getMessage()));
        }finally {

            recorder.release();
            recorder=null;
        }
        stopSelf();

        mStartRecording = false;

    }
}



@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


@Override
public void onTaskRemoved(Intent rootIntent) {
    Intent restartServiceIntent = new Intent(getApplicationContext(),this.getClass());
    restartServiceIntent.setPackage(getPackageName());
    startService(restartServiceIntent);
    super.onTaskRemoved(rootIntent);
}
}
  

Широкополосный приемник

 public class Receiver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {

        Toast.makeText(context,"Booted",Toast.LENGTH_SHORT).show();
        Intent serviceIntent = new Intent(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startService(serviceIntent);
    }
  }
  

Манифест

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
   <receiver android:name=".Receiver"
        android:enabled="true"
        android:exported="true"
        >

        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"/>
            <action android:name="RestartService"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            <action android:name="android.intent.action.REBOOT"/>
        </intent-filter>
    </receiver>
    <service android:name=".Myservice"/>
  

Я использую Android 10 и pie, работает ли он над этими версиями?

Комментарии:

1.Есть ли у вас Activity приложение, которое вы запускаете после установки, чтобы вывести ваше приложение из остановленного состояния? Ваш приемник не будет работать до тех пор. Кроме того, избавьтесь от этого <category> из <intent-filter> RestartService <action> , а также.

2. Да, у меня есть Mainactivity в моем приложении

3. Сэр, я проверил список BOOT_COMPLETED not

4. Я не знаю, что это значит. Как именно вы определяете, что проблема возникла у получателя? Откуда вы знаете, что это не Service сбой?

5. Сэр, я использую этот код, пожалуйста, проверьте ссылку

Ответ №1:

Вы можете использовать JobService android.intent.action.BOOT_COMPLETED этот метод не работает в последней версии Android.

Служба заданий

 public MyJobService extends JobService {
   private Handler myHandler = new Handler(new Handler.Callback() {
      @Override
       public boolean handler(Message msg) {
         Log.e("TAG", "Does it run after reboot? ");      
         return true;  
      }     
     });
@Override
public boolean onStartJob(JobParameters params) {
  myHandler.sendMessage(Message.obtain(myHandler, 1, params));
  return true; 
}
 
@Override
public boolean onStopJob(JobParameters params) {
 myHandler.removeMessages(1);  

    }   
  }
  

MainActivity

 MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle saveInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.layout);
 ComponentName serviceComponent = new ComponentName(this,MyJobService.class);
 JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
 builder.setMinimumLatency(1 * 1000);
 builder.setOverrideDeadline(5 * 1000);
 builder.setPersisted(true);
 JobScheduler jobScheduler = (JobScheduler) getSystemService(this.JOB_SCHEDULER_SERVICE);
 jobScheduler.schedule(builder.build());
   } 
 }
  

AndroidManifest.xml

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="you.package.name">
<application
..............
 >
<service
  android:name=".your.package.MyJobService"
        android:permission="android.permission.BIND_JOB_SERVICE" />
 </mainfest>
  

Комментарии:

1. Запускается ли он после перезагрузки устройства

2. Я использовал этот код, но все еще не работает после перезагрузки устройства. Даже когда я убиваю приложение из последних 2 раз

3. когда я убиваю приложение один раз, оно работает, но когда я очищаю последние приложения во второй раз, приложение перестает работать

4. Он работает нормально, я буду использовать WorkManager вместо JobService