Asynctask не работает, когда приложение закрыто - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время я работаю над приложением для видеоконференций, чего я хочу добиться, чтобы, когда кто-то звонит мне и, получив его звонок, я закрывал приложение, удаляя его из последних приложений, а затем хочу уведомить вызывающего абонента, отклонив его. вызов, когда приложение закрыто из последних приложений

public class RecentAppService extends Service {

private static final String TAG = "RecentAppStatus";


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

@Override
public void onCreate() {
    super.onCreate();
    Log.i(TAG, "onCreate()");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand()");
    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    Log.i(TAG, "onTaskRemoved()....!!!!!!!!!!");
    Boolean callactive= AppsharedPreference.getAppPrefrerence(this)
            .readBooleanData("callingactive");
    Log.i(TAG, "onTaskRemoved()....!!!!!!!!!! Callactive ::::"+callactive);

    if(callactive){

        NotificationManager nManager = ((NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE));
        nManager.cancelAll();
        rejectCall();

    }


    Intent restartService = new Intent(getApplicationContext(), this.getClass());
    restartService.setPackage(getPackageName());
    PendingIntent restartServicePI = PendingIntent.getService(
            getApplicationContext(), 1, restartService,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI);


}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "onDestroy()");
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    Log.i(TAG, "onLowMemory()");
}

public void rejectCall(){

    AsyncTaskRunner runner = new AsyncTaskRunner(this);
    runner.execute();

}
}

Я добавил вышеупомянутый сервис Sticky для выполнения задач, когда кто-то закрывает мое приложение из недавних приложений, я также добавил приведенный ниже код, содержащий Asynctask, к Сервису для выполнения функции отклонения вызова

class AsyncTaskRunner extends AsyncTask<String, String, String> {

private String resp;
private Context mcontext;
public AsyncTaskRunner(Context mContext) {
    this.mcontext=mContext;
}


@Override
protected String doInBackground(String... params) {
    publishProgress("Sleeping..."); // Calls onProgressUpdate()
    try {

        String mUserHash= AppsharedPreference.getAppPrefrerence(mcontext)
                .readStringData("mUserHash");
        String rejectApi= AppsharedPreference.getAppPrefrerence(mcontext)
                .readStringData("rejectApi");
        String apiToken= AppsharedPreference.getAppPrefrerence(mcontext)
                .readStringData("apiToken");
        String room= AppsharedPreference.getAppPrefrerence(mcontext)
                .readStringData("room");
        String callId= AppsharedPreference.getAppPrefrerence(mcontext)
                .readStringData("callId");

        ApiCallData apiCallData = new ApiCallData(rejectApi, apiToken, room, callId,mUserHash);
        WebService.getWebservice().rejectCall(mcontext, apiCallData, new FutureCallback<String>() {
            @Override
            public void onCompleted(Exception e, String result) {
                Log.i(TAG, "onTaskRemoved()....!!!!!!!!!! Result"+result);

        }
        });
    }  catch (Exception e) {
        e.printStackTrace();
        resp = e.getMessage();
    }
    return resp;
}


@Override
protected void onPostExecute(String result) {

Log.i(TAG, "onTaskRemoved()....!!!!!!!!!! Result"+result);
}


@Override
protected void onPreExecute() {

}


@Override
protected void onProgressUpdate(String... text) {


}
}

Все работает нормально, и вызов правильно отключается на стороне вызывающего абонента, когда приложение не на переднем плане, а когда приложение открыто, тогда задача не выполняется в Asynctask, т. Е. Asynctask останавливается, когда приложение закрывается. Я новичок в Android, спасибо

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать FirebaseJobDispatcher для выполнения некоторых действий, даже если приложение закрыто.

для использования FirebaseJobDispatcher сначала вам нужно создать работу, которая будет выглядеть примерно так: -

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
                        Job myJob = dispatcher.newJobBuilder()
                                .setService(SyncJobScheduler.class)
                                .setTrigger(Trigger.executionWindow(0, 0))
                                .setTag("Set_your_unique_tag_here")
                                .setReplaceCurrent(false)
                                .build();

                        dispatcher.mustSchedule(myJob);

Поместите этот код выше, где вы хотите запустить любую задачу / выполнить любую конкретную задачу

и затем вы можете создать свой класс планировщика следующим образом: -

public class SyncJobScheduler extends JobService {
    @Override
    public boolean onStartJob(final JobParameters job) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (("Set_your_unique_tag_here").equalsIgnoreCase(job.getTag())) {
                       //PERFORM YOUR TASK HERE_ WHICH YOU WANT TO RUN IN ASYNCTASK OR SERVICE
                        //IT WILL RUN EVEN IF APP IS IN BACKGROUND /CLOSED
                    }
                } catch (Throwable ignored) {

                }
            }
        }).start();
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters job) {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...