如何使该电话状态始终保持广播接收器正常工作?(不间断) [英] How can I make this phone call states Broadcast receiver to work all the times?(non-stops)

查看:85
本文介绍了如何使该电话状态始终保持广播接收器正常工作?(不间断)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应用程序,它将在呼叫状态之前和之后显示吐司消息。我在手机上生成并安装了应用程序。 几天或什至几个小时后,它运行良好。但之后,它停止了,要运行该应用程序,我需要再次打开该应用程序。如何修改我的应用程序以使其运行良好?谢谢

I'm creating an application, which will show toast messages before and after the call states. I generated and installed my application on my mobile. it was working well after a few days or sometimes a few hours. but after that, it's stopped, in order to run the application I need to open the application again. how can I modify my application to work very well? Thank you


清单

manifest


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


    <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"></activity>
        <activity android:name=".MainActivity2">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> <!-- This part is inside the application -->
        <receiver
            android:name=".CallReceiver"
            android:enabled="true">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>
    </application>

</manifest>



MainActivity.class

MainActivity.class


@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

       checkAndRequestPermissions();

      }
    private  boolean checkAndRequestPermissions() {
 int readPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
 int read_call_log = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG);

 List listPermissionsNeeded = new ArrayList<>();

 if (readPhoneState != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.READ_CALL_LOG);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
 }

 if (read_call_log != PackageManager.PERMISSION_GRANTED) {
     listPermissionsNeeded.add(Manifest.permission.INTERNET);
 }

 if (!listPermissionsNeeded.isEmpty()) {
     ActivityCompat.requestPermissions(this,
             (String[]) listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
             REQUEST_ID_MULTIPLE_PERMISSIONS);

     return false;
 }
 return true;
}



CallReciver.class

CallReciver.class


public class CallReceiver extends BroadcastReceiver{


    @Override
        public void onReceive(Context context, Intent intent) {

            try {

                runfirstTime(context,intent);
                Toast.makeText(context, "1st", Toast.LENGTH_SHORT).show();

            } catch (Exception ex) {
                try {

                }
                catch (Exception e)
                {

                }
            }
        }
      }


推荐答案

除非创建前台服务,否则新版本的Android不允许您执行尝试达到的目标。

New versions of Android does not allow you to do what you are trying to achieve, unless you create foreground service.

Android不想让应用在后台运行

Android does not want apps to run in background without explicit knowledge of the user.

因此,您需要创建前台服务并在通知面板中显示持久性通知。然后,您可以从前景服务中创建一个BroadcastReceiver。

So you need to create a foreground service and show a persistent notification in notification panel. Then you can create a BroadcastReceiver from the Foreground Service.

使用下面的代码将您的服务作为前景服务启动

Launch your service as a foreground service using the code below

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   context.startForegroundService(intent);
}
else {
   context.startService(intent); 
}

在使用中,onCreate()会这样:

And in service onCreate() make something like that:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   startForeground(1, new Notification());
}

下面的链接将使您对前景服务有更多的了解。

Links below will give you a little more insight into Foreground Services.

https://blog.logimonk.com/post/foreground- android中的服务

https://medium.com/@debuggingisfun/android-o-work-around-background-service-limitation-e697b2192bc3

从服务创建您的BroadcastReceiver。

这篇关于如何使该电话状态始终保持广播接收器正常工作?(不间断)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆