Question

From the given ListView in picture, I select the contact to send sms and move to another activity (second picture). And from this sms Activity picture. When I press back hardware button available on phone, I should move where I want. I don't want a default Activity to be displayed. How can I do this?

public class SendSms extends Activity{
ListView listView;
List<RowItems> rowItems;
CustomListViewAdapter adapter;

String toNumbers = "";
String separator;
int i=0,j,count=0,count1; String a[]=new String[5];
String number,val2;

 @Override
  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new4); 
listView = (ListView) findViewById(R.id.list);

rowItems = new ArrayList<RowItems>();

val2=getIntent().getStringExtra("name");
 ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null,   null);


 if (cur.getCount() > 0) {

    while (cur.moveToNext()) {
  String rawContactId =              cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

  Cursor c = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[] {
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                   // ContactsContract.CommonDataKinds.Phone.TYPE,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.PHOTO_ID
            }, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[] { rawContactId }, null);
  if (c != null) {
        if (c.moveToFirst()) {
            String number = c.getString(0);
            //int type = c.getInt(1);
            String name = c.getString(1);
            int photoId = c.getInt(2);
            Bitmap bitmap = queryContactImage(photoId);
            RowItems p=new RowItems(bitmap, number, name);
            rowItems.add(p);

        } 
        adapter = new CustomListViewAdapter(this,
                R.layout.new5, rowItems);
        listView.setAdapter(adapter);


        c.close();
    }
}
    }
}


 private Bitmap queryContactImage(int imageDataRow) {
Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {
    ContactsContract.CommonDataKinds.Photo.PHOTO
}, ContactsContract.Data._ID + "=?", new String[] {
    Integer.toString(imageDataRow)
}, null);
byte[] imageBytes = null;
if (c != null) {
    if (c.moveToFirst()) {
        imageBytes = c.getBlob(0);
    }
    c.close();
}

if (imageBytes != null) {
    return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
} else {
    return null;
  }
  } 
    public void showResult(View v) {
// String result = "";
String result1="";
    for (RowItems p : adapter.getBox()) {
      if (p.chck){
       // result += "\n" + p.getTitle();
        result1 +="\n" +p.getDesc();
        a[i]=p.getTitle();
        i++;
       count++;
      }
      count1=count; 
    } 

    Toast.makeText(this, result1+"\n", Toast.LENGTH_LONG).show();
  }



       public void send(View v) throws IOException {
    int value=a.length-count1;
    for(j=0;j<a.length-value;j++){   
         if(android.os.Build.MANUFACTURER.equalsIgnoreCase("Samsung")){   
                separator = ",";   
            } else   
                separator = ";";       


     number = a[j];   
    toNumbers= toNumbers +number +separator;   

}  

 toNumbers = toNumbers.substring(0, toNumbers.length());


    Uri sendSmsTo = Uri.parse("smsto:" + toNumbers);

    String smsValue = "help iam in danger..i am presently at \n"+val2;
    if(val2==null){
        Toast.makeText(SendSms.this, "wait.....", Toast.LENGTH_LONG).show();
    }

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setType("vnd.android-dir/mms-sms");
    intent.putExtra("sms_body", smsValue);
    intent.setData(sendSmsTo);

    startActivity(intent);

    }
Was it helpful?

Solution 2

I think you should, when the Activity picture is displayed, try to call the onBackPressed method.

// back button pressed method
@Override
public void onBackPressed() {
     super.onBackPressed();
     // new intent to call an activity that you choose
     Intent intent = new Intent(this, NewActivity.class);
     startActivity(intent);
     // finish the activity picture
     this.finish();
}

If you don't want to call an external Activity, you can hide the layout calling by the Intent as below:

// back button pressed method
@Override
public void onBackPressed() {
     super.onBackPressed();
     // your layout with the picture is displayed, hide it
     if(MySecondView.getVisibility() == View.VISIBLE)
            MySecondView.setVisibility(View.Gone);  
     // display the layout that you want
     MyDefaultView.setVisibility(View.VISIBLE); 
}  

As I said below, try with a boolean that you initialize to false at the beginning of your Class. When you start the Intent.ACTION_VIEW, make this boolean to true:

public class Foo extends Activity {
    private boolean isSms = false;
    // some stuff  

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setType("vnd.android-dir/mms-sms");
    // ...
    startActivity(intent);  
    // make your boolean to true  
    isSms = true;  

    // create the onBackPressed method  
    @Override
    public void onBackPressed() {
          // check if the user is on the sms layout
          if(isSms)
              // do something  
          else
              // do something else like finish(); your activity

     }

 }  

Or you can try to use the onKeyDown method (see here: onKeyDown (int keyCode, KeyEvent event)) as below:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0) {
        // dome some stuff
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

You can see the diffence between these two methods here: onBackPressed() not working and on the website that I talk in the comments below.
Hope this will be useful.


UPDATE:
A better way should make an startActivityForResult to start the Intent.ACTION_VIEW:

startActivityForResult(intent, 1);  

And then, you return the cancel code like this:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode != 1 && resultCode == RESULT_CANCELED) {
        // do something
    }
}  

This is @FunkTheMonk, just above, who tells the good choice!

OTHER TIPS

Use startAtctivityForResult, and in onActivityResult check the resultCode. If it is Activity.RESULT_CANCELLED, the user 'backed out' of the SMS activity. Due to the implementation of the SMS activity being outside of your control, this might not be the only case when the result code says it has been cancelled.

Add this method to the class to handle device back button.

@Override
public void onBackPressed() {
// do something
}

Please note that it requires API Level 5 or higher.

You have to overide go back behaviour of hardware back button by calling a method name onbackpressed();

@Override
public void onBackPressed() {
 super.onBackPressed();
 // set intent to activity where you want to move on after back press
 Intent intent = new Intent(this, NewActivity.class);
 startActivity(intent);
 // also clean the current activity from stack.
 youractivityname.this.finish();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top