如何在android“ Pie”中关闭应用程序时检测电话状态广播接收者

问题描述 投票:1回答:1

我正在尝试使用TelephoneManager类并使用作业调度程序来获取电话状态,我已经为onCallStateChangeListener()分配了侦听器...但仍然是android 9“ Pie”杀死了像我这样的所有后台任务侦听器和jobScheduler!所以当我的应用程序完全关闭时,我该如何解决此问题并获得电话状态!

注意:我尝试了类似Truecaller的应用程序,并且在关闭应用程序后可以正常使用!我如何在我的应用程序上得到类似的行为?

MainActivity.java

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;


public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private static final int JOB_ID = 123;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        scheduleJob();
    }

    public void scheduleJob() {
        ComponentName componentName = new ComponentName(this, ExampleJobService.class);
        JobInfo info = new JobInfo.Builder(JOB_ID , componentName)
                .setPersisted(true)
                .setPeriodic(15 * 60 * 1000)
                .build();

        JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        int resultCode = scheduler.schedule(info);
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d(TAG, "Job scheduled");
        } else {
            Log.d(TAG, "Job scheduling failed");
        }
    }

    public void cancelJob() {
        JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        scheduler.cancel(123);
        Log.d(TAG, "Job cancelled");
    }
}

JobScheduler.java

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Context;
import android.os.Looper;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class ExampleJobService extends JobService {

    private static final String TAG = "ExampleJobService";
    boolean quitLooper;
    TelephonyManager telephonyManager;

    public void checkForIncomingCalls() {

        telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        new Thread(new Runnable() {
            @Override
            public void run() {
                quitLooper = false;
                Looper.prepare();
                PhoneStateListener callStateListener = new PhoneStateListener() {
                    @Override
                    public void onCallStateChanged(int state, String phoneNumber) {
                        if(state==TelephonyManager.CALL_STATE_RINGING){
                            Toast.makeText(getApplicationContext(),"Phone Is Riging",
                                    Toast.LENGTH_LONG).show();
                        }
                        if(state==TelephonyManager.CALL_STATE_OFFHOOK){
                            Toast.makeText(getApplicationContext(),"Phone is Currently in A call",
                                    Toast.LENGTH_LONG).show();
                        }

                        if(state==TelephonyManager.CALL_STATE_IDLE){
                            Toast.makeText(getApplicationContext(),"phone is neither ringing nor in a call",
                                    Toast.LENGTH_LONG).show();
                        }
                    }
                };
                telephonyManager.listen(callStateListener , PhoneStateListener.LISTEN_CALL_STATE);

                Looper.loop();
            }
        }).start();
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d(TAG, "Job started");

        doBackgroundWork(params);

        return true;
    }

    private void doBackgroundWork(final JobParameters params) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                    checkForIncomingCalls();

                Log.d(TAG, "Job finished");
                jobFinished(params, false);
            }
        }).start();
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d(TAG, "Job cancelled before completion");
        return true;
    }

}

Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devteam.test231">

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


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".ExampleJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"/>

    </application>

</manifest>

谢谢!

android multithreading service background job-scheduling
1个回答
0
投票

您是否找到解决此问题的方法?

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.