onBackPressed() Best Practice/Performance - java

I usually override onBackPressed() like this:
#Override
public void onBackPressed() {
super.onBackPressed();
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
startActivity(intent);
finish();
}
Only now I saw that when I click the back button with this code I see for 0.5 sec a white activity in the transition.
Testing a little bit I found that if I use this code instead the problem didn't happen:
#Override
public void onBackPressed() {
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
startActivity(intent);
finish();
super.onBackPressed();
}
What's the difference between this two code? If I use the second one is fine? Cause any memory problem? Thanks

super.onBackPressed just calls finish. It isn't needed if you're calling finish yourself. Just remove the line.
The reason you may see a visual difference is that in one you're finishing this intent then starting a new one, vs starting a new one then finishing this one. The first may leave a blank screen briefly.

Related

Activity is destroyed when I start another activity without finishing the first activity

I'm struggling with this issue and I want to know if there is any option to know why an activity is being closed, I have checked if it was a low memory issue with Runtime.getRuntime().freeMemory(); but everything looks fine.
UPDATE
Here is how I call the activities and when suddenly all the background activities are closed. In all the way from MainActivity to SketchActivity I'm not calling the finish(); method but when I start the SketchActivity from BoulderProfileActivity, all the activies are destroyed, except SketchActivity :
MainActivity:
private void SendUserToFindBoulderActivity(){
Intent boulderFindIntent = new Intent(MainActivity.this, FindBouldersActivity.class);
startActivity(boulderFindIntent);
}
FindBouldersActivity:
holder.mView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent boulderProfileIntent = new
Intent(FindBouldersActivity.this,BoulderProfileActivity.class);
boulderProfileIntent.putExtra("BoulderKey", BoulderKey);
startActivity(boulderProfileIntent);
}
});
BoulderProfileActivity:
public void SendUserToSketchUpActivity(){
Intent sketchIntent = new Intent(BoulderProfileActivity.this, SketchActivity.class);
sketchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
if(sustituir==false) {
sketchIntent.putExtra("BoulderKey", BoulderKey);
sketchIntent.putExtra("Uri", ImageUri);
sketchIntent.putExtra("sustituir", sustituir);
}else{
sketchIntent.putExtra("BoulderKeyForSwitchFirstImage", BoulderKey);
sketchIntent.putExtra("Uri", ImageUri);
sketchIntent.putExtra("photoKey", photoKey);
sketchIntent.putExtra("sustituir", sustituir);
}
startActivity(sketchIntent);
}
When you start SketchActivity you are using flags
sketchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
and these flags close all previous activities and start the activity in a new task.
so to keep old previous activities please remove this line.
if you don't know what is a task, the task is the container for activities, so when you start new task this means that the activity is the first activity if you want to read more about tasks follow this link :
https://developer.android.com/guide/components/activities/tasks-and-back-stack
and you can find more information about intent flags here
https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_CLEAR_TASK
Any chance you enabled developer mode (System -> Developer options), and it is force-closing the Activity?
There's an option (Developer Options, under 'apps', I'm using a Pixel 3) called 'Don't keep Activities' which should be disabled.

Android skip Activity and put it last

I am trying to make a skip button and it have to do what i draw.
i honestly don't know how can i make this happen.
The code actually have to skip the current activity and put it as last.
if the activity's question was answered, there is no skip.here i draw
I have tried a few things but it's beyond my powers.
Intent intent=new Intent(this, c1_2.class);
startActivity(intent);
finish();
you can use arrayList or Queue for keep your activityes, then use it to start Activity.
try this.
final ArrayList<Class> activities = new ArrayList<>();
// add your activity---------------
activities.add(c1_1.class);
activities.add(c1_2.class);
activities.add(c1_3.class);
//----------------------------
butonSkip=findViewById(R.id.skip);
butonSkip.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Class firstActivity = activities.get(0);
startActivity(new Intent(c1_1.this,activities.get(0)));
activities.remove(0);
activities.add(firstActivity);
}
});
//-----------can change activities data
// activities.set(1, c1_3.class);

How to clear memory from pictures of previous layouts? How to clean memory when go to different layout/activity?

My app consists from 4 layout files, each layout uses a different image as background. I manage to load layout 1 and 2, but after I go to layout 3 I get error "Caused by: java.lang.OutOfMemoryError"
I suspect it's because the layout 1 and layout 2 is still in the memory. Any way is there a way to clean memory everytime I go to a new layout so I don't run out of memory? Thanks.
P.S I use Android Studio.
P.S 2 I'm not sure if this changes anything but just in case this is how I go to different activities/layouts:
previouspage.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), secondPage.class);
startActivity(intent);
}
}
);
nextpage.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), FourthPage.class);
startActivity(intent);
}
}
);
new Button.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), secondPage.class);
startActivity(intent);
yourExistingActivity.finish(); // This will free the memory
}
Note that the activity you're calling the finish() method from is destroyed and ALL its resources are queued for garbage collection, and all memory that was used by this activity will be freed during next GC cycle.
If you really want to revoke the memory as soon as possible, override your activities' onDestroy method:
#Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}

How to Close an Intent Activity from another Class

Basically I'm using the following code to open Google Navigation within an activity
String uri = "google.navigation:ll="+LAT+","+LNG;
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(i);
Where LAT & LNG are the coordinates of a specific destination. Basically what I'm trying to do is once the destination is reached, an action would be triggered where the navigation activity closes and return to the same Class it was opened in.
Any help would be much appreciated.
EDIT:
i guess since the activity i opened "Google Navigation" is beyond my control it is impossible to close it from within the app. So the best solution would be to reopen the current activity once the destination is reached.
Appreciate all the answers.
Use finish() method to end the first activity
use Finish() method to kill your activity as
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
finish();
Use finish() method to end an activity
Use finish() to kill the activity.
Add Finish() method to end up an activity#
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(i);
finish();
If you press your back button it will work !! don't finish() the previous activity.
Dont call finish() when you are starting the intent. Once you finish with navigation press back button
Maybe you should put a thread to compare the destination and current location.
Like this:
Thread thread = new Thread(){
#Override
public void run() {
// TODO: Do your work here
myHandler.sendMessage(new Message());
}
};
create a handler and implementing the handleMessage method.
Handler myHandler = new Handler(){
#Override
public void handleMessage(Message msg) {
// TODO: finish the activity here
finish();
}
};

How to exit an Android app programmatically?

I am sure this question has been asked number of times because I read a few. My client wants me to put a button into his app where users can click and exit. I have read this and found calling finish() will do it. But, finish is only closing the current running activity right? I have lot of activities so in this case I have to pass each and every activity's instance and finish them or make every activity into Singleton pattern.
I also got to know Activity.moveTaskToBack(true) can get you into the home screen. OK, this is not closing but backgrounding the process. So is this is effective?
Which method should I use to close the app completely? Any of above described or any other method/other usage of above methods?
The finishAffinity method, released in API 16, closes all ongoing activities and closes the app:
this.finishAffinity();
Finish this activity as well as all activities immediately below it in the current task that have the same affinity. This is typically used when an application can be launched on to another task (such as from an ACTION_VIEW of a content type it understands) and the user has used the up navigation to switch out of the current task and in to its own task. In this case, if the user has navigated down into any other activities of the second application, all of those should be removed from the original task as part of the task switch.
Note that this finish does not allow you to deliver results to the previous activity, and an exception will be thrown if you are trying to do so.
Since API 21, you can use:
finishAndRemoveTask();
Finishes all activities in this task and removes it from the recent tasks list.
Alternatives:
getActivity().finish();
System.exit(0);
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);
Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);
Source: How to quit android application programmatically
Actually everyone is looking for closing the application via an onclick event, wherever may be activity...
Add this code to an onclick event:
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
You can call System.exit(); to get out of all the acivities.
submit=(Button)findViewById(R.id.submit);
submit.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
});
If you want to exit from your application, use this code inside your button pressed event:
public void onBackPressed() {
moveTaskToBack(true);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
#Override
public void onBackPressed() {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Exit Application?");
alertDialogBuilder
.setMessage("Click yes to exit!")
.setCancelable(false)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
moveTaskToBack(true);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
It's way too easy. Use System.exit(0);
Accually there are two possible situations:
You may want to exit from the activity
Or you want to exit from the application
You can exit from the activity using following code:
var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();
But this will not kill the underlying activities in the same application.
This will just minimize the application.
If you want to exit from application use the following code to end its process:
android.os.Process.killProcess(android.os.Process.myPid());
for mono development just use
process.KillProcess(Process.MyPid());
How about this.finishAffinity()
From the docs,
Finish this activity as well as all activities immediately below it in the current task that have the same affinity. This is typically used when an application can be launched on to another task (such as from an ACTION_VIEW of a content type it understands) and the user has used the up navigation to switch out of the current task and in to its own task. In this case, if the user has navigated down into any other activities of the second application, all of those should be removed from the original task as part of the task switch.
Note that this finish does not allow you to deliver results to the previous activity, and an exception will be thrown if you are trying to do so.
android.os.Process.killProcess(android.os.Process.myPid());
this will clear Task(stack of activities) and begin new Task
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);
Use this Code it's much useful, and you can exit all of the activities.
#Override
public void onBackPressed() {
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
}
Achieving in Xamarin.Android:
public override void OnBackPressed()
{
MoveTaskToBack(true);
Process.KillProcess(Process.MyPid());
Environment.Exit(1);
}
put this one into your onClic:
moveTaskToBack(true);
finish()
Try this on a call. I sometimes use it in onClick of a button.
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
It instead of closing your app , opens the dashboard so kind of looks like your app is closed.
read this question for more clearity
android - exit application code
Use this.finishAffinity(); on that button instead of finish();
If it does not work then you can also try by adding android:noHistory="true" in your manifest and then finish your activity by uisng finish(); or finishAffinity();
Hope it helps....:)
Just call these two functions
finish();
moveTaskToBack(true);
Link this method to your quit/exit button
public void quitGame(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
}
ghost activity called with singletop and finish() on onCreate should do the trick
It works using only moveTaskToBack(true);
Instead of System.exit(1) Just use System.exit(0)
finish();
finishAffinity();
System.exit(0);
worked for me
If someone still wonders, for Xamarin.Android (in my case also Monogame running on it) the command FinishAndRemoveTask() on Activity does the job very well!
in the fragment
getActivity().finishAndRemoveTask();
in the Activity
finishAndRemoveTask();
just use the code in your backpress
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
If you are using EventBus (or really any other pub/sub library) in your application to communicate between activities you can send them an explicit event:
final public class KillItWithFireEvent
{
public KillItWithFireEvent() {}
public static void send()
{
EventBus.getDefault().post(new KillItWithFireEvent());
}
}
The only downside of this is you need all activities to listen to this event to call their own finish(). For this you can easily create shim activity classes through inheritance which just listen to this event and let subclasses implement everything else, then make sure all your activities inherit from this extra layer. The kill listeners could even add some extra functionality through overrides, like avoiding death on certain particular situations.
Just run the below two lines when you want to exit from the application
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Just call this:
finishAffinity();
This can work I tried it too.
this.finishAffinity();
In Fragment use getActivity().finishAffinity(); and clear fragment binding without memory leaks

Categories