3

I am trying to implement sms scheduling app. I am calling a service after selecting the time when the user needs to schedule an sms. Everything works fine when the app is running in foreground and background. But not working when the app is closed. I have used alarm manager as well and same is the thing with alarm manager. I have also declared "Process" attribute in the manifest file. Any help would be appreciated.

These are my code files. Have a look.

1. MainActivity 

public class MainActivity extends AppCompatActivity implements 
View.OnClickListener{

Button mButton;
EditText mPhoneNumber;
EditText mMessage;
String message=null;
String phoneNumber=null;
Button alarmButton;
int number;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButton = (Button)findViewById(R.id.send_button);
    mPhoneNumber = (EditText) findViewById(R.id.phone_number);
    mMessage = (EditText) findViewById(R.id.message);
    message=mMessage.getText().toString();
    phoneNumber=mPhoneNumber.getText().toString();
    alarmButton=(Button)findViewById(R.id.alarm_button);

    alarmButton.setOnClickListener(this);
    mButton.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    switch(view.getId()){

        case R.id.send_button:
            if(!message.equals(null)&&!phoneNumber.equals(null)){
                sendSS(mMessage.getText().toString(),mPhoneNumber.getText().toString());
            }
            break;
        case R.id.alarm_button:
            int currentHour,currentMinute;
            Calendar ca = Calendar.getInstance();
            currentHour = ca.get(Calendar.HOUR_OF_DAY);
            currentMinute = ca.get(Calendar.MINUTE);
            // Launch Time Picker Dialog
            TimePickerDialog tpd = new TimePickerDialog(this,
                    new TimePickerDialog.OnTimeSetListener() {
                        @Override
                        public void onTimeSet(TimePicker view, int hourOfDay,
                                              int minute) {
                                sendPickedTime(hourOfDay,minute);
                        }
                    }, currentHour, currentMinute, true);
            tpd.show();
            break;
    }

}

public void sendSS(String messageText, String contactNumber){

    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);
    //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS sent",
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure",
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service",
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Null PDU",
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Radio off",
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(SENT));
    //---when the SMS has been delivered---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS delivered",
                            Toast.LENGTH_SHORT).show();
                    break;
                case Activity.RESULT_CANCELED:
                    Toast.makeText(getBaseContext(), "SMS not delivered",
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(DELIVERED));
    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},1);
    SmsManager smsManager=SmsManager.getDefault();
    Log.i("contactNumber",contactNumber);
    Log.i("messageText",messageText);
   smsManager.sendTextMessage(contactNumber,null,messageText,sentPI,deliveredPI);
}

public void sendPickedTime(final int mHour, final int mMinute){

    int mYear,mMonth,mDay;
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    DatePickerDialog datePickerDialog = new DatePickerDialog(this,
            new DatePickerDialog.OnDateSetListener() {

                @Override
                public void onDateSet(DatePicker view, int year,
                                      int monthOfYear, int dayOfMonth) {
                    Calendar messageDT=Calendar.getInstance();
                    messageDT.set(year, monthOfYear , dayOfMonth);
                    messageDT.set(Calendar.HOUR_OF_DAY, mHour);
                    messageDT.set(Calendar.MINUTE, mMinute);
                    messageDT.set(Calendar.SECOND, 0);
                    sendMessage(messageDT);
                }
            }, mYear, mMonth, mDay);

    datePickerDialog.show();
}

public void sendMessage(Calendar cal){
    //Intent intentAlarm = new Intent(this, AlarmReceiver.class);
    Intent intent = new Intent(MainActivity.this, NewService.class);
    String message=mMessage.getText().toString();
    String phoneNumber=mPhoneNumber.getText().toString();
    if(!message.equals(null)&&!phoneNumber.equals(null)){
    intent.putExtra("contactNumber",phoneNumber);
    intent.putExtra("messageContent",message);
    }
    PendingIntent pIntent = PendingIntent.getService(MainActivity.this, 0, intent,0);
    // create the object

    Toast.makeText(this, "We will takecare of your sms :)", Toast.LENGTH_LONG).show();
    startService(new Intent(getApplicationContext(),NewService.class));
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pIntent);
    //set the alarm for particular time
    //alarmManager.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), PendingIntent.getBroadcast(this,0,  intentAlarm, 0));

}

}

public class NewService extends Service {

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


@Override
public void onCreate() {
    super.onCreate();
    Log.i("Service is created","Service is created");

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("Message is end","Message is end");
    SmsManager smsManager=SmsManager.getDefault();
    if(intent.hasExtra("contactNumber")&&intent.hasExtra("messageContent")) {
        smsManager.sendTextMessage(intent.getExtras().getString("contactNumber"), null, intent.getExtras().getString("messageContent"), null, null);
    }else{
        //smsManager.sendTextMessage("+918939376946", null, "Message failed", null, null);
    }
        return START_STICKY;
}

}

public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
        SmsManager smsManager=SmsManager.getDefault();
       // Log.i("contactNumber",contactNumber);
        //Log.i("messageText",messageText);
        smsManager.sendTextMessage("+91*********",null,"nvjkrvk",null,null);
    Log.i("Received Alarm","Alarm Trigerred");
}

}

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.*****.sendingsms"
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SEND_SMS"></uses-        permission>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <receiver android:name=".AlarmReceiver"
              android:enabled="true"
              android:exported="true"
        android:process=":remote"></receiver>
    <service android:name=".NewService"
             android:exported="true"
             android:process=":ServiceProcess"
             android:enabled="true"
        />
</application>

activit_main.xml

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout
 android:id="@+id/activity_main"
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="com.*****.sendingsms.MainActivity">

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="Enter Message"
    android:id="@+id/message"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Send SMS"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:id="@+id/send_button"/>

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="Enter phone no."
    android:id="@+id/phone_number"
    android:layout_below="@+id/message"
    android:layout_alignParentStart="true"/>
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Set Alarm"
    android:layout_below="@id/send_button"
    android:id="@+id/alarm_button"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"/>
   </RelativeLayout>
  • please read this @satish https://stackoverflow.com/questions/4643850/android-alarm-is-cancelled-after-closing-the-application when you kill app...force fully you have to clear your privious alarm manager and register new alarm manger with same alarm manager id ...... – santoXme Jun 05 '17 at 09:36
  • > try this its working for me https://stackoverflow.com/questions/44204387/alarmmanager-setinexactrepeating-setwindow-setrepeating-methods-do-not-fire-al/44205413#44205413 – Aniruddh Parihar Jun 05 '17 at 10:03
  • Issue got fixed. I am having Android marshmallow 6.0 which is having options to let an app auto start. Once I added my app to that list receiver started getting triggered and code is absolutely working fine. Thanks for all your efforts :) – Satish Nani Aug 15 '17 at 16:23
  • in which device you tested?? i am testing on samsung note 8 it is not working... – Vivek Mar 20 '20 at 13:19
  • @Vivek did you get the answer? – Saloni Parikh Jul 29 '20 at 11:20

0 Answers0