-1

I'm starting an activity from the background service by using following piece of code:

Intent intent = new Intent(getApplicationContext(),AlarmActivity.class);   
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
startActivity(intent);

But when I finish the activity by clicking the OK or Snooze button the app doesn't close but minimises instead.
When that minimised app is opened, the alarm starts ringing again until the app is closed manually.
I've tried by following commands as well but no gain.

android.os.Process.killProcess(android.os.Process.myPid()); 

 

System.exit(1);

What could be the issue?

ActivityCode:

import android.content.Context;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.os.Vibrator;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
import android.widget.TextView;

import com.solutionz.battery.saver.master.alarm.utils.AdInterstitial;
import com.solutionz.battery.saver.master.alarm.utils.AppGlobal;
import com.solutionz.battery.saver.master.alarm.utils.MySharedPreferences;

public class AlarmActivity extends AppCompatActivity {
    Context context;
    TextView title_tv, message_tv;
    ImageView batteryIcon_iv;
    TextView ok_tv, snooze_tv;
    boolean isCharging;
    Ringtone ringtone;
    Vibrator vibrator;
    Handler handler;
    Runnable runnable;
    PowerManager.WakeLock screenLock;
    MySharedPreferences mySharedPreferences;
    AdInterstitial adInterstitial;

    long[] pattern = {1000, 500, 1000, 1000, 500};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        setContentView(R.layout.activity_alarm);
        mySharedPreferences = new MySharedPreferences(context);
        adInterstitial = new AdInterstitial(context);
        screenLock = ((PowerManager) getSystemService(POWER_SERVICE)).newWakeLock(
                PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        screenLock.acquire();

        setScreenSize();
        setViews();
        setContent();
        setTimer();
        adInterstitial.requestLoadInterstitial(false);
    }

    private void setScreenSize() {
        // getting and setting the window size
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        // int width = (int) (size.x * 0.7);
        // int height = (int) (size.y * 0.4);

        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.gravity = Gravity.CENTER;
        //params.height = height;
        //params.width = width;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;

        this.getWindow().setAttributes(params);
    }

    private void setViews() {
        title_tv = (TextView) findViewById(R.id.title_tv);
        message_tv = (TextView) findViewById(R.id.message_tv);
        batteryIcon_iv = (ImageView) findViewById(R.id.batteryIcon_iv);
        ok_tv = (TextView) findViewById(R.id.ok_tv);
        snooze_tv = (TextView) findViewById(R.id.snooze_tv);

        scaleView(batteryIcon_iv, 0.7f, 1.0f);

        ok_tv.getCompoundDrawables()[1].mutate().setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
        snooze_tv.getCompoundDrawables()[1].mutate().setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);

        ok_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySharedPreferences.SetLastNotifiedChargingState(isCharging);
                mySharedPreferences.SetIsNotified(true);
                finish();
                //android.os.Process.killProcess(android.os.Process.myPid());
//                  System.exit(1);
            }
        });
        snooze_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mySharedPreferences.SetIsSnoozed(true);
                 finish();
//android.os.Process.killProcess(android.os.Process.myPid());
//                  System.exit(1);
                }
            }
        });
    }

    private void setContent() {
        Bundle bundle = getIntent().getBundleExtra("data");
        title_tv.setText(bundle.getString("title"));
        message_tv.setText(bundle.getString("message"));
        isCharging = bundle.getBoolean("isCharging");

        if (!isCharging) {
            batteryIcon_iv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_battery_30));
            batteryIcon_iv.getDrawable().mutate().setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
        } else {
            batteryIcon_iv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_battery_charging_80));
            batteryIcon_iv.getDrawable().mutate().setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
        }
        // playAlarmTone();
        mediaPlayerSetting();
    }

    public void scaleView(View v, float startScale, float endScale) {
        Animation anim = new ScaleAnimation(
                startScale, endScale, // Start and end values for the X axis scaling
                startScale, endScale, // Start and end values for the Y axis scaling
                Animation.RELATIVE_TO_SELF, 0.5f, // Pivot point of X scaling
                Animation.RELATIVE_TO_SELF, 0.5f); // Pivot point of Y scaling
        anim.setFillAfter(true); // Needed to keep the result of the animation
        anim.setDuration(1000);
        anim.setRepeatMode(Animation.REVERSE);
        anim.setRepeatCount(Animation.INFINITE);
        v.startAnimation(anim);
    }

    public void mediaPlayerSetting() {

        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);

        if (mySharedPreferences.GetIsSoundEnabled())   // Play sound
        {
            int volume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
            if (volume == 0)
                volume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
            audioManager.setStreamVolume(AudioManager.STREAM_ALARM, volume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

            ringtone = RingtoneManager.getRingtone(getApplicationContext(), notification);
            if (ringtone != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    ringtone.setAudioAttributes(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build());
                } else {
                    ringtone.setStreamType(AudioManager.STREAM_ALARM);
                }
                ringtone.play();
            }

        }
        if (mySharedPreferences.GetIsVibrationEnabled()) // Start vibration
        {
            vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(pattern, 0);
        }
    }

    private void setTimer() {
        handler = new Handler();
        runnable = new Runnable() {
            @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void run() {

                AppGlobal.showNotification(getApplicationContext(), title_tv.getText().toString(), message_tv.getText().toString());
                AlarmActivity.this.finish();
            }
        };
        handler.postDelayed(runnable, mySharedPreferences.GetAlarmDuration() * 1000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (ringtone != null && ringtone.isPlaying()) ringtone.stop();
        if (vibrator != null) vibrator.cancel();
        handler.removeCallbacks(runnable);
        screenLock.release();
    }
}
Usman Rana
  • 2,067
  • 1
  • 21
  • 32
  • If API is >= 16 then you should try with `finishAffinity();` – bshears Dec 21 '16 at 18:58
  • Please, read [this (how to ask)](http://stackoverflow.com/help/how-to-ask) and [this (mcve)](http://stackoverflow.com/help/mcve) before asking, as those will help you get more and better answers from the community. There are way too many possibilities for this to happen. Activities should not be manually destroyed (nor the `System.exti()` be invoked). Show the `onPause`/`onDestroy` methods – Bonatti Dec 21 '16 at 18:58
  • @bshears , just tried that, no gain. – Usman Rana Dec 21 '16 at 19:12
  • You are not supposed to "exit" apps in android. The system itself will terminate the app if it needs the resources. Finish tells it that it is ok to do so, and in a properly written app, it's all you need to do. – alzee Dec 21 '16 at 19:16
  • The app is "closed". You have no active activities in the task. Why do you think it isn't "closed"? – David Wasser Dec 22 '16 at 09:57
  • @DavidWasser . When i call finish() method onClick at OK button, then activity is no more visible to user but when 1 check Recent apps then app is present there, means it is not fully closed but minimized in a sense. – Usman Rana Dec 22 '16 at 10:42
  • No. This is not correct. What you are seeing is not a "minimised app". You are looking at the "list of recent tasks". Your app is not running. Your activities are not active. – David Wasser Dec 22 '16 at 15:00

1 Answers1

0

In Android finish() method is not closing the app but minizing it

No. First of all there's no concept of "minimizing" apps on Android, and finish() is NOT closing the main app process, but only finished the activity.

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141