Search code examples
androidandroid-activityapplicationcontext

What is wrong with this use of Application context in Android?


I abstract my model like this:first there is a class UserInfo which holds user information:

public class UserInfo extends Application{
private int userid;
public void setUserId(int id)
{
    userid=id;
}
public int  getUserId()
{
    return userid;
}

}

Then in MainActivity:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    userinfo=(UserInfo)getApplication();
    userinfo.setUserId(1354);
    ....
    Intent intent=new Intent(MainActivity.this,VoteActivity.class);                 
                startActivity(intent);
}
public
@Override void onResume()
{
    super.onResume();
    TextView text=(TextView)MainActivity.this.findViewById(R.id.usernameText);
    text.setText(userinfo.getUserId()+" ");
}

And in VoteActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_vote);        
    userinfo=(UserInfo)getApplication(); 
    Button back=(Button)findViewById(R.id.backButton);
    back.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View arg0) {
            userinfo.setUserId(-100);
            Intent intent=new        Intent(VoteActivity.this,MainActivity.class);
            startActivity(intent);

        }});

}

The result is: when MainActivity first run, userid in UserInfo is 1354 ; And when VoteActivity first run, userid in UserInfo is 1354 too.However when back to MainActivity from VoteAcitivy userid remains 1354 which should be -100.What is wrong with this use of Application context?


Solution

  • You're starting a new activity in your onClick method :

    Intent intent=new        Intent(VoteActivity.this,MainActivity.class);
            startActivity(intent);
    

    And you direct set your id in the MainActivity :

     userinfo.setUserId(1354);
    

    That's why you get (1354). You should call finish in your on click (instead of starting the MainActivity).

    The activity's stack look like this : MainActivity - VoteActivity - MainActivity and I think you want it to look like this : MainActivity after pressed on your Button

    @Override
            public void onClick(View arg0) {
                userinfo.setUserId(-100);
                finish();
    
            }});