I am wanting to change my ringtone volume at specific time each day. I used a calendar to specify the time, and I am attempting to use alarmManager to execute it. Here is what I have. (I am a noobie go easy on me)
package com.example.ringervolume.app; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import java.util.Calendar; public class MainActivity extends ActionBarActivity { private AudioManager audio; private PendingIntent pendingIntentam; private PendingIntent pentdingIntentpm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textViewTime = (TextView) findViewById (R.id.textTime); audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE); //ringer volume for the am. Calendar calendaram = Calendar.getInstance(); calendaram.set(Calendar.HOUR_OF_DAY, 21); calendaram.set(Calendar.MINUTE, 32); calendaram.set(Calendar.SECOND, 0); calendaram.set(Calendar.AM_PM,Calendar.PM); Intent myIntent = new Intent(MainActivity.this, MyReceiver.class); pendingIntentam = PendingIntent.getBroadcast(MainActivity.this, 0,myIntent,0); AlarmManager alarmManageram = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManageram.set(AlarmManager.RTC, calendaram.getTimeInMillis(), pendingIntentam); } public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent scheduledIntent = new Intent(context, myscheduleactivity.class); scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(scheduledIntent); } } public class myscheduleactivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); audio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
You can schedule a work, with onetime initial delay or execute it periodically, using the WorkManager as follows: Create Worker class: public class MyWorker extends Worker { @Override public Worker. WorkerResult doWork() { // Do the work here // Indicate success or failure with your return value: return WorkerResult.
The job scheduler API. The Android 5.0 Lollipop (API 21) release introduces a job scheduler API via the JobScheduler class. This API allows to batch jobs when the device has more resources available. In general this API can be used to schedule everything that is not time critical for the user.
Use WorkManager for reliable work WorkManager is intended for work that is required to run reliably even if the user navigates off a screen, the app exits, or the device restarts. For example: Sending logs or analytics to backend services. Periodically syncing application data with a server.
Android WorkManager is a background processing library which is used to execute background tasks which should run in a guaranteed way but not necessarily immediately. With WorkManager we can enqueue our background processing even when the app is not running and the device is rebooted for some reason.
To fire alarm everyday, at 21:32
private AlarmManager alarmMgr; private PendingIntent alarmIntent; ... alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); // Set the alarm to start at 21:32 PM Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 21); calendar.set(Calendar.MINUTE, 32); // setRepeating() lets you specify a precise custom interval--in this case, // 1 day alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
In this case, AlarmReceiver
is the Broadcast Receiver and it already has a context, so you can directly set the ringer mode to silent from the Broadcast Receiver without starting an activity.
@Override public void onReceive(Context context, Intent intent) { AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); am.setRingerMode(AudioManager.RINGER_MODE_SILENT); }
Please be sure to add these permissions :
<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" ></uses-permission> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" ></uses-permission>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With