Java 当最小化时,Android应用程序在特定时间后终止

Java 当最小化时,Android应用程序在特定时间后终止,java,android,Java,Android,我有这个应用程序,它解析短信,然后将它们转换成音频。我的应用程序用户通常会最小化应用程序并一直运行它。但我的应用程序过了一段时间就会被终止。如何确保我的应用程序在用户“终止”它之前一直运行。由于该应用程序的核心功能是将短信转换为音频,我需要它一直运行。我如何才能做到这一点 我当前的MainActivity.java public class MainActivity extends AppCompatActivity { TextView txtGateway, txtTime, tx

我有这个应用程序,它解析短信,然后将它们转换成音频。我的应用程序用户通常会最小化应用程序并一直运行它。但我的应用程序过了一段时间就会被终止。如何确保我的应用程序在用户“终止”它之前一直运行。由于该应用程序的核心功能是将短信转换为音频,我需要它一直运行。我如何才能做到这一点

我当前的MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView txtGateway, txtTime, txtAmount;
    Speakerbox speakerbox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //textView = findViewById(R.id.txt_message);
        speakerbox = new Speakerbox(getApplication());
        txtAmount = findViewById(R.id.tv_amount);
        txtGateway = findViewById(R.id.tv_gateway);
        txtTime = findViewById(R.id.tv_time);
        requestSmsPermission();

    }


    @Override
    public void onResume() {
        LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("otp"));
        super.onResume();
    }
    @Override
    public void onPause() {
        LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("otp"));
        super.onPause();
    }
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equalsIgnoreCase("otp")) {
                final String message = intent.getStringExtra("message");
                String gateway = intent.getStringExtra("gateway");
                String time = intent.getStringExtra("time");
                String amount = intent.getStringExtra("amount");
                speakerbox.play(message);
                txtGateway.setText(gateway);
                txtTime.setText(time);
                txtAmount.setText(amount);


                // message is the fetching OTP
            }
        }
    };




    /**
     * Requesting multiple permissions (storage and location) at once
     * This uses multiple permission model from dexter
     * On permanent denial opens settings dialog
     */
    private void requestSmsPermission() {
        Dexter.withActivity(this)
                .withPermissions(
                        Manifest.permission.RECEIVE_SMS,
                        Manifest.permission.READ_SMS,
                        Manifest.permission.SEND_SMS,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {
                        // check if all permissions are granted
                        if (report.areAllPermissionsGranted()) {
                            //  Toast.makeText(getApplicationContext(), "All permissions are granted!", Toast.LENGTH_SHORT).show();
                        }

                        // check for permanent denial of any permission
                        if (report.isAnyPermissionPermanentlyDenied()) {
                            // show alert dialog navigating to Settings
                            showSettingsDialog();
                        }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).
                withErrorListener(new PermissionRequestErrorListener() {
                    @Override
                    public void onError(DexterError error) {
                        Toast.makeText(getApplicationContext(), "Error occurred! ", Toast.LENGTH_SHORT).show();
                    }
                })
                .onSameThread()
                .check();
    }

    /**
     * Showing Alert Dialog with Settings option
     * Navigates user to app settings
     * NOTE: Keep proper title and message depending on your app
     */
    private void showSettingsDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Need Permissions");
        builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.");
        builder.setPositiveButton("GOTO SETTINGS", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                openSettings();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.show();

    }

    // navigating user to app settings
    private void openSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivityForResult(intent, 101);
    }
}
public类MainActivity扩展了AppCompatActivity{
TextView txtGateway、txtTime、txtAmount;
Speakerbox Speakerbox;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//textView=findviewbyd(R.id.txt_消息);
speakerbox=新的speakerbox(getApplication());
txtAmount=findViewById(R.id.tv\U金额);
txtGateway=findviewbyd(R.id.tv\u网关);
txtTime=findViewById(R.id.tv\u时间);
requestSmsPermission();
}
@凌驾
恢复时公开作废(){
LocalBroadcastManager.getInstance(this.registerReceiver(接收方,新意向过滤器(“otp”));
super.onResume();
}
@凌驾
公共无效暂停(){
LocalBroadcastManager.getInstance(this.registerReceiver(接收方,新意向过滤器(“otp”));
super.onPause();
}
private BroadcastReceiver=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
if(intent.getAction().equalsIgnoreCase(“otp”)){
最终字符串消息=intent.getStringExtra(“消息”);
stringgateway=intent.getStringExtra(“网关”);
字符串时间=intent.getStringExtra(“时间”);
字符串金额=intent.getStringExtra(“金额”);
speakerbox.play(消息);
setText(网关);
setText(时间);
txtAmount.setText(金额);
//消息是获取OTP
}
}
};
/**
*一次请求多个权限(存储和位置)
*这使用dexter的多权限模型
*永久拒绝打开“设置”对话框
*/
私有void requestSmsPermission(){
Dexter.withActivity(本)
.具有权限(
Manifest.permission.RECEIVE_短信,
Manifest.permission.READ_SMS,
Manifest.permission.SEND_短信,
清单.权限.写入(外部存储)
.withListener(新的MultiplePermissionsListener(){
@凌驾
已检查许可证上的公共无效(多个许可证报告){
//检查是否已授予所有权限
if(report.areAllPermissionsGranted()){
//Toast.makeText(getApplicationContext(),“已授予所有权限!”,Toast.LENGTH\u SHORT.show();
}
//检查是否永久拒绝任何许可
if(report.isAnyPermissionPermanentlyDenied()){
//显示导航到设置的警报对话框
显示设置对话框();
}
}
@凌驾
public void onPermissionRationalAlleshouldbeshown(列出权限、PermissionToken令牌){
token.continuePermissionRequest();
}
}).
withErrorListener(新权限RequestErrorListener(){
@凌驾
公共无效onError(DEXTERROR错误){
Toast.makeText(getApplicationContext(),“出错!”,Toast.LENGTH\u SHORT.show();
}
})
.onSameThread()
.检查();
}
/**
*显示带有设置选项的警报对话框
*将用户导航到应用程序设置
*注意:根据您的应用程序保留适当的标题和消息
*/
私有无效显示设置对话框(){
AlertDialog.Builder=新建AlertDialog.Builder(MainActivity.this);
builder.setTitle(“需要权限”);
setMessage(“此应用程序需要使用此功能的权限。您可以在应用程序设置中授予它们。”);
setPositiveButton(“转到设置”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
openSettings();
}
});
setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
}
});
builder.show();
}
//将用户导航到应用程序设置
私有void openSettings(){
意向意向=新意向(设置、操作、应用程序、详细信息、设置);
Uri=Uri.fromParts(“包”,getPackageName(),null);
intent.setData(uri);
startActivityForResult(意向,101);
}
}

活动用于应用程序中面向用户的部分。使用服务代替。很可能,由于内存不足,您的应用程序将被操作系统终止。

如果您想一直在后台运行,请使用服务作为核心功能。如果用户未积极使用您的应用程序,但应用程序正在占用RAM内存,则操作系统将终止应用程序,以避免内存不足。

使用前台服务确保您的应用程序正常运行没有被安卓杀死。在较新版本的Android上,应用程序的后台进程会在一段时间后被终止。拥有前台服务将确保你的应用程序保持正常运行