SlideShare uma empresa Scribd logo
1 de 157
Hi !
Yonatan V.Levin
levin.yonatan parahall
Google Developer Expert
CTO & Co Founder
Why app is crashed when got an update
from widget?
Background
Android 101
Memory @ Android
!=
SWAP Space No Swap space
Activity Manager
Process Process Process Process Process Process
oom_adj: 0 oom_adj: 2 oom_adj: 8 oom_adj: 7 oom_adj: 1 oom_adj: 9
Activity Manager
Process Process Process Process Process Process
oom_adj: 0 oom_adj: 2 oom_adj: 8 oom_adj: 7 oom_adj: 1 oom_adj: 9
OOM
Killer
Threshold: 10Kb, 7
Activity Manager
Process Process Process
oom_adj: 0 oom_adj: 2 oom_adj: 1
Free memory
bash-3.2# logcat -t 1000 | grep "has died"
01-29 15:01:09.577 1278 1283 I ActivityManager: Process
com.motorola.calendar (pid 8595) has died.
01-29 15:07:46.957 1278 1278 I ActivityManager: Process
com.dropbox.android (pid 8606) has died.
bash-3.2# dmesg | grep sigkill
<4>[58305.115783] send sigkill to 8595 (torola.calendar), adj 13, size
3198
<4>[58702.255462] send sigkill to 8606 (dropbox.android), adj 14, size
2942
What is a Service
A Service is an application component that can perform
long-running operations in the background, and it does not
provide a user interface.
Why Service
One of 4 core components → App entry points
Stay alive when users navigate out of your app
Can be cached
Can be run on separate process
Rowing direction
Changes in O
The startService() method now throws an
IllegalStateException if an app targeting Android 8.0 tries to
use that method in a situation when it isn't permitted to
create background services.
More is coming
● August 2018: New apps required to target API level 26
(Android 8.0) or higher.
● November 2018: Updates to existing apps required to
target API level 26 or higher.
● 2019 onwards: Each year the targetSdkVersion
requirement will advance. Within one year following each
Android dessert release, new apps and app updates will
need to target the corresponding API level or higher.
The king is dead. Long live the king
"The service as we know it today - is
deprecated.
It's no longer allowed to fulfill the main
purpose - execute the long-running task in
the background. Therefore it's no longer
usable"
Yoni Levin
Let’s explore very simple scenario
App in Foreground - Let’s execute it now!
ExecutorService executor = Executors.newFixedThreadPool(threads);
executor.submit(myWork);
App in Foreground - Let’s execute it now!
ExecutorService executor = Executors.newFixedThreadPool(threads);
executor.submit(myWork);
Login succeeded?
OkHttp
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000;
retry = 3;
Worst case scenario: 3 * 30 = 90 seconds.
Build long running task
Maybe not so long running task, but it can takes minutes to
execute and update UI when it finished
Wait, but what if the user offline?
So, we need to switch to use a
service.
But you can’t!!!!
Don’t put your hands down
Let’s use JobScheduler
JobScheduler mJobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE);
int jobInfoNetworkType = convertNetworkType(constraints.getRequiredNetworkType());
PersistableBundle extras = new PersistableBundle();
extras.putBoolean(EXTRA_IS_PERIODIC, isPeriodic);
JobInfo.Builder builder = new JobInfo.Builder(jobId, serviceComponent)
.setRequiredNetworkType(jobInfoNetworkType)
.setRequiresCharging(false)
.setRequiresDeviceIdle(false)
.setExtras(extras)
.setPersisted(true)
.build();
mJobScheduler.schedule(jobInfo);
if (Build.VERSION.SDK_INT >= 23) {
//use JobService
}
But I have minSDK < 21 23
JobDispatcher
Job myJob = firebaseJobDispatcher.newJobBuilder()
.setService(SmartService.class)
.setTag(SmartService.LOCATION_SMART_JOB)
.setRecurring(true)
.setLifetime(FOREVER)
.setTrigger(Trigger.executionWindow(0, 60 * 5))
.setReplaceCurrent(false)
.setConstraints(ON_ANY_NETWORK)
.build();
firebaseJobDispatcher.mustSchedule(myJob);
No promise when a job executed
And more…
+--- com.firebase:firebase-jobdispatcher:0.5.2
| +--- com.android.support:support-v4:25.0.0 -> 25.3.0 (*)
| --- com.google.android.gms:play-services-gcm:10.0.1 -> 10.2.1
| +--- com.google.android.gms:play-services-base:10.2.1
| | +--- com.google.android.gms:play-services-basement:10.2.1
| | | --- com.android.support:support-v4:24.0.0 -> 25.3.0 (*)
| | --- com.google.android.gms:play-services-tasks:10.2.1
| | --- com.google.android.gms:play-services-basement:10.2.1 (*)
| +--- com.google.android.gms:play-services-basement:10.2.1 (*)
| --- com.google.android.gms:play-services-iid:10.2.1
| +--- com.google.android.gms:play-services-base:10.2.1 (*)
| --- com.google.android.gms:play-services-basement:10.2.1 (*)
+--- com.firebase:firebase-jobdispatcher:0.5.2
| +--- com.android.support:support-v4:25.0.0 -> 25.3.0 (*)
| --- com.google.android.gms:play-services-gcm:10.0.1 -> 10.2.1
| +--- com.google.android.gms:play-services-base:10.2.1
| | +--- com.google.android.gms:play-services-basement:10.2.1
| | | --- com.android.support:support-v4:24.0.0 -> 25.3.0 (*)
| | --- com.google.android.gms:play-services-tasks:10.2.1
| | --- com.google.android.gms:play-services-basement:10.2.1 (*)
| +--- com.google.android.gms:play-services-basement:10.2.1 (*)
| --- com.google.android.gms:play-services-iid:10.2.1
| +--- com.google.android.gms:play-services-base:10.2.1 (*)
| --- com.google.android.gms:play-services-basement:10.2.1 (*)
Tens millions of devices
Let’s use Alarm + Executer?
AlarmManager alarmManager = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
Intent delayMet = CommandHandler.createIntent(context, workSpecId);
PendingIntent pendingIntent = PendingIntent.getService(
context, alarmId, delayMet, PendingIntent.FLAG_ONE_SHOT);
alarmManager.set(RTC_WAKEUP, triggerAtMillis, pendingIntent);
PowerManager powerManager = (PowerManager)
getSystemService(Context.POWER_SERVICE);
powerManager.newWakeLock(PARTIAL_WAKE_LOCK, "tag").acquire();
WakeLock Pain
What about constraints & rescheduling?
Wait.
But I still want to benefit from old
services on pre-O devices!
JobIntentService
Context.startService()
< >=
JobScheduler.enqueue()
setOverrideDeadline(0)
JobIntentService
onStartJob(JobParams)
JobService
onHandleWork(Intent intent);
onStopJob(JobParams ) onStopCurrentWork()
Oh! Someone restarted a phone!
BOOT_COMPLETED
<receiver
android:name=".AppReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"
/>
</intent-filter>
</receiver>
The fight which hard to win
So let’s start to think about more
abstract solution
So here is the summary of what we need
- Abstraction
- Choose the best work scheduler/execution
- Execute when we meet work Criteria
- Work Persistency
- Handle Failure and Reschedule
- Remove finished job
WorkManager
WorkManager aims to simplify the developer experience by
providing a first-class API for system-driven background
processing. It is intended for background jobs that should
run even if the app is no longer in the foreground. Where
possible, it uses JobScheduler or Firebase JobDispatcher to
do the work; if your app is in the foreground, it will even try
to do the work directly in your process.
Data
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executor
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
WorkResult
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
Data
WorkResult
public class LocationUploadWorker extends Worker {
...
//Upload last passed location to the server
public WorkerResult doWork() {
ServerReport serverReport = new
ServerReport(getInputData().getDouble(LOCATION_LONG, 0),...);
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("WorkerReport");
ref.push().setValue(serverReport);
return WorkerResult.SUCCESS;
}
}
public class LocationUploadWorker extends Worker {
...
//Upload last passed location to the server
public WorkerResult doWork() {
ServerReport serverReport = new
ServerReport(getInputData().getDouble(LOCATION_LONG, 0),...);
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("WorkerReport");
ref.push().setValue(serverReport);
return WorkerResult.SUCCESS;
}
}
public class LocationUploadWorker extends Worker {
...
//Upload last passed location to the server
public WorkerResult doWork() {
ServerReport serverReport = new
ServerReport(getInputData().getDouble(LOCATION_LONG, 0),...);
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("WorkerReport");
ref.push().setValue(serverReport);
return WorkerResult.SUCCESS;
}
}
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
Data
WorkResult
Constraints constr = new Constraints.Builder().
setRequiredNetworkType(NetworkType.CONNECTED).build();
Data inputData = new Data.Builder()
.putDouble(LOCATION_LAT, location.getLatitude())
.putDouble(LOCATION_LONG, location.getLongitude())
.putLong(LOCATION_TIME, location.getTime()).build();
OneTimeWorkRequest uploadWork = new
OneTimeWorkRequest.Builder(LocationUploadWorker.class)
.setConstraints(constr).setInputData(inputData).build();
Constraints constr = new Constraints.Builder().
setRequiredNetworkType(NetworkType.CONNECTED).build();
Data inputData = new Data.Builder()
.putDouble(LOCATION_LAT, location.getLatitude())
.putDouble(LOCATION_LONG, location.getLongitude())
.putLong(LOCATION_TIME, location.getTime()).build();
OneTimeWorkRequest uploadWork = new
OneTimeWorkRequest.Builder(LocationUploadWorker.class)
.setConstraints(constr).setInputData(inputData).build();
Constraints constr = new Constraints.Builder().
setRequiredNetworkType(NetworkType.CONNECTED).build();
Data inputData = new Data.Builder()
.putDouble(LOCATION_LAT, location.getLatitude())
.putDouble(LOCATION_LONG, location.getLongitude())
.putLong(LOCATION_TIME, location.getTime()).build();
OneTimeWorkRequest uploadWork = new
OneTimeWorkRequest.Builder(LocationUploadWorker.class)
.setConstraints(constr).setInputData(inputData).build();
Constraints constr = new Constraints.Builder().
setRequiredNetworkType(NetworkType.CONNECTED).build();
Data inputData = new Data.Builder()
.putDouble(LOCATION_LAT, location.getLatitude())
.putDouble(LOCATION_LONG, location.getLongitude())
.putLong(LOCATION_TIME, location.getTime()).build();
OneTimeWorkRequest uploadWork = new
OneTimeWorkRequest.Builder(LocationUploadWorker.class)
.setConstraints(constr).setInputData(inputData).build();
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
Data
WorkResult
WorkManager.getInstance().enqueue(uploadWork);
Data
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
WorkResult
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
updateWorkState
publish
Processor
Data
enqueue()
WorkManager
WorkRequest
saveWork
Worker
publish
Data
WorkResult
Data
Data
enqueue()
WorkManager
JobScheduler
JobDispatcher
Executer
AlarmManager
WorkDatabase
WorkRequest
saveWork
updateWorkState
publish
Processor
Worker
WorkResult
workManager.getStatusById(locationWork.getId()).observe(
this, workStatus -> {
if(workStatus!=null && workStatus.getState().isFinished()){
...
workStatus.getOutputData()...
}
}
workManager.getStatusById(locationWork.getId()).observe(
this, workStatus -> {
if(workStatus!=null && workStatus.getState().isFinished()){
...
workStatus.getOutputData()...
}
}
workManager.getStatusById(locationWork.getId()).observe(
this, workStatus -> {
if(workStatus!=null && workStatus.getState().isFinished()){
...
workStatus.getOutputData()...
}
}
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
WorkManager.getInstance().enqueue(locationWork);
Location
Every 15 min
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
WorkManager.getInstance().enqueue(locationWork);
Location
Every 15 min
WorkManager.getInstance(this)
.beginWith(Work.from(LocationWork.class))
.then(Work.from(LocationUploadWork.class))
.enqueue();
Upload
Location
WorkManager.getInstance(this)
.enqueue(Work.from(LocationWork.class,LocationUploadWork.class));
Upload
Location
Note:
You can’t enqueue chain of periodic and one-time work
together.
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
workManager.enqueue(locationWork);
workManager.cancelWorkById(locationWork.getId());
Cancel
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
workManager.enqueue(locationWork);
workManager.cancelWorkById(locationWork.getId());
Cancel
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
Location
Every 15 min
Location
Every 15 min
PeriodicWorkRequest locationWork = new
PeriodicWorkRequest.Builder(LocationWork.class, 15,TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
workManager.cancelAllWorkByTag(LocationWork.TAG);
Real Life
public class MyActivity extends AppCompatActivity {
protected void onCreate(...) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType .CONNECTED).build();
OneTimeWorkRequest profileFetchWork =
new OneTimeWorkRequest.Builder(ProfileFetchWorker.class)
.setConstraints(constraints).build();
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(profileFetchWork);
…
}
}
public class MyActivity extends AppCompatActivity {
protected void onCreate(...) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType .CONNECTED).build();
OneTimeWorkRequest profileFetchWork =
new OneTimeWorkRequest.Builder(ProfileFetchWorker.class)
.setConstraints(constraints).build();
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(profileFetchWork);
…
}
}
public class MyActivity extends AppCompatActivity {
protected void onCreate(...) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType .CONNECTED).build();
OneTimeWorkRequest profileFetchWork =
new OneTimeWorkRequest.Builder(ProfileFetchWorker.class)
.setConstraints(constraints).build();
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(profileFetchWork);
…
}
}
public class MyActivity extends AppCompatActivity {
protected void onCreate(...) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType .CONNECTED).build();
OneTimeWorkRequest profileFetchWork =
new OneTimeWorkRequest.Builder(ProfileFetchWorker.class)
.setConstraints(constraints).build();
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(profileFetchWork);
…
}
}
public class MyActivity extends AppCompatActivity {
protected void onCreate(...) {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType .CONNECTED).build();
OneTimeWorkRequest profileFetchWork =
new OneTimeWorkReques .Builder(ProfileFetchWorker.class)
.setConstraints(constraints).build();
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(profileFetchWork);
…
}
}
public class ProfileFetchWorker extends Worker {
public WorkerResult doWork() {
List<Profile> profiles = loadProfiles(getAppContext());
Data profileData = ResUtil.profileToMap(profiles);
setOutputData(profileData);
return WorkerResult.SUCCESS;
}
}
public class ProfileFetchWorker extends Worker {
public WorkerResult doWork() {
List<Profile> profiles = loadProfiles(getAppContext());
Data profileData = ResUtil.profileToMap(profiles);
setOutputData(profileData);
return WorkerResult.SUCCESS;
}
}
public class ProfileFetchWorker extends Worker {
public WorkerResult doWork() {
List<Profile> profiles = loadProfiles(getAppContext());
Data profileData = ResUtil.profileToMap(profiles);
setOutputData(profileData);
return WorkerResult.SUCCESS;
}
}
public class ProfileFetchWorker extends Worker {
public WorkerResult doWork() {
List<Profile> profiles = loadProfiles(getAppContext());
Data profileData = ResUtil.profileToMap(profiles);
setOutputData(profileData);
return WorkerResult.SUCCESS;
}
}
What about status update?
public class MyActivity extends AppCompatActivity {
public void startFetchProfiles() {
...
UUID workId = profileFetchWork.getId();
workManager.getStatusById(workId).observe(this,workStatus-> {
if (workStatus.getState().isFinished()) {
updateUI(workStatus.getOutputData());
}
});
}
}
public class MyActivity extends AppCompatActivity {
public void startFetchProfiles() {
...
UUID workId = profileFetchWork.getId();
workManager.getStatusById(workId).observe(this,workStatus-> {
if (workStatus.getState().isFinished()) {
updateUI(workStatus.getOutputData());
}
});
}
}
public class MyActivity extends AppCompatActivity {
public void startFetchProfiles() {
...
UUID workId = profileFetchWork.getId();
workManager.getStatusById(workId).observe(this,workStatus-> {
if (workStatus.getState().isFinished()) {
updateUI(workStatus.getOutputData());
}
});
}
}
public class MyActivity extends AppCompatActivity {
public void startFetchProfiles() {
...
UUID workId = profileFetchWork.getId();
workManager.getStatusById(workId).observe(this,workStatus-> {
if (workStatus.getState().isFinished()) {
updateUI(workStatus.getOutputData());
}
});
}
}
MV{x} pattern
View ViewModel Very fast API
List<Profile>
UpdateUI
ProfileFetchWorker
onChange
Get
Profiles
ProfileDao
View ViewModel
Profile
Repository
ProfileNetworkDataSource
SQLite
Very fast API
Room
LiveData<List<Profile>
LiveData<Profile[]>
Observe
Observe
LifecycleOwner
Load
Profiles
ProfileFetchWorker
Get
Profiles
ProfileDao
View ViewModel
Profile
Repository
ProfileNetworkDataSource
SQLite
Very fast API
Room
LiveData<List<Profile>
MutableLiveData<Profile[]>
Observe
Observe
LifecycleOwner
Load
Profiles
ProfileFetchWorker
LiveData<WorkStatus>
insert
ProfileDao
View ViewModel
Profile
Repository
ProfileNetworkDataSource
SQLite
Very fast API
Room
LiveData<List<Profile>
MutableLiveData<Profile[]>
onChange
LifecycleOwner
ProfileFetchWorker
LiveData<WorkStatus>
onChange
onChange
onChange
success
Get Location
Main
Activity
Service
HandlerThread
Looper
Location
Handler
Network
Handler
Location
Tracker
BOOT_COMPLETE
D
Receiver
AlarmManager
Every 15 min
View
WorkManager
UploadWork
Location
Tracker
Every 15 min
LocationWork
public class LocationWork extends Worker {
public WorkerResult doWork() {
...
return WorkerResult.SUCCESS;
}
}
Synchronous execution
mLocationManager.
requestSingleUpdate(LocationManager.GPS_PROVIDER,
mGpsLocationListener, looper);
Asynchronous execution
public class GpsLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
...
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
...
return WorkerResult.SUCCESS;
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
looper = handlerThread.getLooper();
locationTracker = new LocationTracker(getAppContext(), looper);
locationTracker.start();
...
return WorkerResult.SUCCESS;
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
looper = handlerThread.getLooper();
locationTracker = new LocationTracker(getAppContext(), looper);
locationTracker.start();
...
return WorkerResult.SUCCESS;
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
looper = handlerThread.getLooper();
locationTracker = new LocationTracker(getAppContext(), looper);
locationTracker.start();
...
return WorkerResult.SUCCESS;
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
looper = handlerThread.getLooper();
locationTracker = new LocationTracker(getAppContext(), looper);
locationTracker.start();
...
return WorkerResult.SUCCESS;
}
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
...
try {
locationWait = new CountDownLatch(1);
locationWait.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
cleanUp();
return WorkerResult.SUCCESS;
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
...
try {
locationWait = new CountDownLatch(1);
locationWait.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
cleanUp();
return WorkerResult.SUCCESS;
}
public class LocationWork extends Worker {
public WorkerResult doWork() {
...
try {
locationWait = new CountDownLatch(1);
locationWait.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
cleanUp();
return WorkerResult.SUCCESS;
}
PeriodicWorkRequest locationWork = new PeriodicWorkRequest
.Builder(LocationWork.class, 15, TimeUnit.MINUTES)
.addTag(LocationWork.TAG)
.build();
WorkManager.getInstance().enqueue(locationWork);
What’s next?
UploadWorker
Naive: Foreground service
Periodic 15 min
44 locations
6% battery
Smart: JobDispatcher
Periodic 15 min
37 locations
1% battery
Worker: Mix
Periodic 15 min
38 locations
2% battery
What about getting update from system?
e.g. Alarm, GeoFence?
geofencingClient.
addGeofences(getGeofencingRequest(), getGeofencePendingIntent());
private PendingIntent getGeofencePendingIntent() {
Intent intent = new Intent(this, GeoFenceReceiver.class);
return PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
private PendingIntent getGeofencePendingIntent() {
Intent intent = new Intent(this, GeoFenceReceiver.class);
return PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
WHY?
sendBroadcast(new Intent("this.is.an.implicit.broadcast"));
04-11 14:12:36.340 753-763/? W/BroadcastQueue: Background execution
not allowed: receiving Intent {
act=android.intent.action.PACKAGE_REMOVED
dat=package:com.commonsware.cwac.cam2.demo flg=0x4000010 (has
extras) } to
com.commonsware.android.sysevents.pkg/.OnPackageChangeReceiver
<receiver
android:name=".GeoFenceReceiver"
android:enabled="true"
android:exported="true"/>
public class GeoFenceReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
...
}
}
public class GeoFenceReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
GeofencingEvent event = GeofencingEvent.fromIntent(intent);
Location location = event.getTriggeringLocation();
Data inputData = ResourceUtil.locToData(location);
OneTimeWorkRequest workRequest = new OneTimeWorkRequest
.Builder(LocationUploadWorker.class)
.setInputData(inputData).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
public class GeoFenceReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
GeofencingEvent event = GeofencingEvent.fromIntent(intent);
Location location = event.getTriggeringLocation();
Data inputData = ResourceUtil.locToData(location);
OneTimeWorkRequest workRequest = new OneTimeWorkRequest
.Builder(LocationUploadWorker.class)
.setInputData(inputData).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
public class GeoFenceReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
GeofencingEvent event = GeofencingEvent.fromIntent(intent);
Location location = event.getTriggeringLocation();
Data inputData = ResourceUtil.locToData(location);
OneTimeWorkRequest workRequest = new OneTimeWorkRequest
.Builder(LocationUploadWorker.class)
.setInputData(inputData).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
public class GeoFenceReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
GeofencingEvent event = GeofencingEvent.fromIntent(intent);
Location location = event.getTriggeringLocation();
Data inputData = ResourceUtil.locToData(location);
OneTimeWorkRequest workRequest = new OneTimeWorkRequest
.Builder(LocationUploadWorker.class)
.setInputData(inputData).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
Alpha Version
“...But android-job will soon reach it’s
end of life…”
parahall

Mais conteúdo relacionado

Mais procurados

Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesAlan Arentsen
 
Advanced task management with Celery
Advanced task management with CeleryAdvanced task management with Celery
Advanced task management with CeleryMahendra M
 
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?PROIDEA
 
Find bottleneck and tuning in Java Application
Find bottleneck and tuning in Java ApplicationFind bottleneck and tuning in Java Application
Find bottleneck and tuning in Java Applicationguest1f2740
 
Getting physical with web bluetooth in the browser hackference
Getting physical with web bluetooth in the browser hackferenceGetting physical with web bluetooth in the browser hackference
Getting physical with web bluetooth in the browser hackferenceDan Jenkins
 
Why Task Queues - ComoRichWeb
Why Task Queues - ComoRichWebWhy Task Queues - ComoRichWeb
Why Task Queues - ComoRichWebBryan Helmig
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task QueueDuy Do
 
50 new features of Java EE 7 in 50 minutes
50 new features of Java EE 7 in 50 minutes50 new features of Java EE 7 in 50 minutes
50 new features of Java EE 7 in 50 minutesAntonio Goncalves
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETGianluca Carucci
 
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...Will it run or will it not run? Background processes in Android 6 - Anna Lifs...
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...DroidConTLV
 

Mais procurados (12)

Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examples
 
Advanced task management with Celery
Advanced task management with CeleryAdvanced task management with Celery
Advanced task management with Celery
 
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?
PLNOG 18 - Piotr Jabłoński - Co i jak można zautomatyzować u operatora?
 
Find bottleneck and tuning in Java Application
Find bottleneck and tuning in Java ApplicationFind bottleneck and tuning in Java Application
Find bottleneck and tuning in Java Application
 
Getting physical with web bluetooth in the browser hackference
Getting physical with web bluetooth in the browser hackferenceGetting physical with web bluetooth in the browser hackference
Getting physical with web bluetooth in the browser hackference
 
Beat the Clock: Background Tasking in Windows 8
Beat the Clock: Background Tasking in Windows 8Beat the Clock: Background Tasking in Windows 8
Beat the Clock: Background Tasking in Windows 8
 
Physical web
Physical webPhysical web
Physical web
 
Why Task Queues - ComoRichWeb
Why Task Queues - ComoRichWebWhy Task Queues - ComoRichWeb
Why Task Queues - ComoRichWeb
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task Queue
 
50 new features of Java EE 7 in 50 minutes
50 new features of Java EE 7 in 50 minutes50 new features of Java EE 7 in 50 minutes
50 new features of Java EE 7 in 50 minutes
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...Will it run or will it not run? Background processes in Android 6 - Anna Lifs...
Will it run or will it not run? Background processes in Android 6 - Anna Lifs...
 

Semelhante a Mobile Fest 2018. Yonatan Levin. WTF with Android Background Restrictions

Velocity 2015: Building Self-Healing Systems
Velocity 2015: Building Self-Healing SystemsVelocity 2015: Building Self-Healing Systems
Velocity 2015: Building Self-Healing SystemsSOASTA
 
Velocity 2015 building self healing systems (slide share version)
Velocity 2015 building self healing systems (slide share version)Velocity 2015 building self healing systems (slide share version)
Velocity 2015 building self healing systems (slide share version)SOASTA
 
2013-05-15 threads. why and how
2013-05-15 threads. why and how2013-05-15 threads. why and how
2013-05-15 threads. why and howCocoaHeads Tricity
 
Android 5.0 internals and inferiority complex droidcon.de 2015
Android 5.0 internals and inferiority complex droidcon.de 2015Android 5.0 internals and inferiority complex droidcon.de 2015
Android 5.0 internals and inferiority complex droidcon.de 2015Aleksander Piotrowski
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go BadSteve Loughran
 
Analysing in depth work manager
Analysing in depth work managerAnalysing in depth work manager
Analysing in depth work managerlpu
 
Practical Operation Automation with StackStorm
Practical Operation Automation with StackStormPractical Operation Automation with StackStorm
Practical Operation Automation with StackStormShu Sugimoto
 
Pandora FMS: Windows Phone 7 Agent
Pandora FMS: Windows Phone 7 AgentPandora FMS: Windows Phone 7 Agent
Pandora FMS: Windows Phone 7 AgentPandora FMS
 
Formal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction ContractsFormal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction ContractsGera Shegalov
 
Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Gabor Varadi
 
MarGotAspect - An AspectC++ code generator for the mARGOt framework
MarGotAspect - An AspectC++ code generator for the mARGOt frameworkMarGotAspect - An AspectC++ code generator for the mARGOt framework
MarGotAspect - An AspectC++ code generator for the mARGOt frameworkLeonardo Arcari
 
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Matthew McCullough
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務Mu Chun Wang
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTPMustafa TURAN
 

Semelhante a Mobile Fest 2018. Yonatan Levin. WTF with Android Background Restrictions (20)

Velocity 2015: Building Self-Healing Systems
Velocity 2015: Building Self-Healing SystemsVelocity 2015: Building Self-Healing Systems
Velocity 2015: Building Self-Healing Systems
 
Velocity 2015 building self healing systems (slide share version)
Velocity 2015 building self healing systems (slide share version)Velocity 2015 building self healing systems (slide share version)
Velocity 2015 building self healing systems (slide share version)
 
2013-05-15 threads. why and how
2013-05-15 threads. why and how2013-05-15 threads. why and how
2013-05-15 threads. why and how
 
Android 5.0 internals and inferiority complex droidcon.de 2015
Android 5.0 internals and inferiority complex droidcon.de 2015Android 5.0 internals and inferiority complex droidcon.de 2015
Android 5.0 internals and inferiority complex droidcon.de 2015
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go Bad
 
Analysing in depth work manager
Analysing in depth work managerAnalysing in depth work manager
Analysing in depth work manager
 
Practical Operation Automation with StackStorm
Practical Operation Automation with StackStormPractical Operation Automation with StackStorm
Practical Operation Automation with StackStorm
 
Celery
CeleryCelery
Celery
 
sun solaris
sun solarissun solaris
sun solaris
 
Pandora FMS: Windows Phone 7 Agent
Pandora FMS: Windows Phone 7 AgentPandora FMS: Windows Phone 7 Agent
Pandora FMS: Windows Phone 7 Agent
 
Mumak
MumakMumak
Mumak
 
Formal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction ContractsFormal Verification of Web Service Interaction Contracts
Formal Verification of Web Service Interaction Contracts
 
Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)Architecting Single Activity Applications (With or Without Fragments)
Architecting Single Activity Applications (With or Without Fragments)
 
MarGotAspect - An AspectC++ code generator for the mARGOt framework
MarGotAspect - An AspectC++ code generator for the mARGOt frameworkMarGotAspect - An AspectC++ code generator for the mARGOt framework
MarGotAspect - An AspectC++ code generator for the mARGOt framework
 
Immutant
ImmutantImmutant
Immutant
 
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
Puppet Availability and Performance at 100K Nodes - PuppetConf 2014
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務
 
Re-Design with Elixir/OTP
Re-Design with Elixir/OTPRe-Design with Elixir/OTP
Re-Design with Elixir/OTP
 

Mais de MobileFest2018

Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile Poets
Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile PoetsMobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile Poets
Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile PoetsMobileFest2018
 
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexy
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexyMobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexy
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexyMobileFest2018
 
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOS
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOSMobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOS
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOSMobileFest2018
 
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...MobileFest2018
 
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...MobileFest2018
 
Mobile Fest 2018. Алексей Лизенко. Make your project great again
Mobile Fest 2018. Алексей Лизенко. Make your project great againMobile Fest 2018. Алексей Лизенко. Make your project great again
Mobile Fest 2018. Алексей Лизенко. Make your project great againMobileFest2018
 
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...MobileFest2018
 
Mobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert KoinMobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert KoinMobileFest2018
 
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложений
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложенийMobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложений
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложенийMobileFest2018
 
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?MobileFest2018
 
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threading
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threadingMobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threading
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threadingMobileFest2018
 
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...MobileFest2018
 
Mobile Fest 2018. Александр Корин. Болеутоляющее
Mobile Fest 2018. Александр Корин. БолеутоляющееMobile Fest 2018. Александр Корин. Болеутоляющее
Mobile Fest 2018. Александр Корин. БолеутоляющееMobileFest2018
 

Mais de MobileFest2018 (13)

Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile Poets
Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile PoetsMobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile Poets
Mobile Fest 2018. Enrique López Mañas. TensorFlow for Mobile Poets
 
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexy
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexyMobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexy
Mobile Fest 2018. Łukasz Mróz. Let’s make your DATA sexy
 
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOS
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOSMobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOS
Mobile Fest 2018. Алексей Демедецкий. Отладка с архитектурой Redux на iOS
 
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...
Mobile Fest 2018. Илья Иванов. Как React-Native перевернул наше представление...
 
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...
Mobile Fest 2018. Владимир Бондаренко. Почему переход с Apache Cordova на Rea...
 
Mobile Fest 2018. Алексей Лизенко. Make your project great again
Mobile Fest 2018. Алексей Лизенко. Make your project great againMobile Fest 2018. Алексей Лизенко. Make your project great again
Mobile Fest 2018. Алексей Лизенко. Make your project great again
 
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...
Mobile Fest 2018. Артем Гетьман. Архитектура обработки ошибок: чистый, быстры...
 
Mobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert KoinMobile Fest 2018. Кирилл Розов. Insert Koin
Mobile Fest 2018. Кирилл Розов. Insert Koin
 
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложений
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложенийMobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложений
Mobile Fest 2018. Алеся Подлесная. UX в разработке мобильных приложений
 
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?
Mobile Fest 2018. Александр Сергиенко. Flutter - что за зверь такой?
 
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threading
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threadingMobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threading
Mobile Fest 2018. Fernando Cejas. What Mom Never Told You About Multi-threading
 
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...
Mobile Fest 2018. Håvard Hvassing. Working with sharp tools — continuous inte...
 
Mobile Fest 2018. Александр Корин. Болеутоляющее
Mobile Fest 2018. Александр Корин. БолеутоляющееMobile Fest 2018. Александр Корин. Болеутоляющее
Mobile Fest 2018. Александр Корин. Болеутоляющее
 

Último

Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphThiyagu K
 
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...Sapna Thakur
 
Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeThiyagu K
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfchloefrazer622
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAssociation for Project Management
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Sapana Sha
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...christianmathematics
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Disha Kariya
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdfQucHHunhnh
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfagholdier
 
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...fonyou31
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Krashi Coaching
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...PsychoTech Services
 

Último (20)

Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
BAG TECHNIQUE Bag technique-a tool making use of public health bag through wh...
 
Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and Mode
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
Disha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdfDisha NEET Physics Guide for classes 11 and 12.pdf
Disha NEET Physics Guide for classes 11 and 12.pdf
 
Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1
 
APM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across SectorsAPM Welcome, APM North West Network Conference, Synergies Across Sectors
APM Welcome, APM North West Network Conference, Synergies Across Sectors
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111Call Girls in Dwarka Mor Delhi Contact Us 9654467111
Call Girls in Dwarka Mor Delhi Contact Us 9654467111
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
Explore beautiful and ugly buildings. Mathematics helps us create beautiful d...
 
Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..Sports & Fitness Value Added Course FY..
Sports & Fitness Value Added Course FY..
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdf
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
Ecosystem Interactions Class Discussion Presentation in Blue Green Lined Styl...
 
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
Kisan Call Centre - To harness potential of ICT in Agriculture by answer farm...
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
IGNOU MSCCFT and PGDCFT Exam Question Pattern: MCFT003 Counselling and Family...
 

Mobile Fest 2018. Yonatan Levin. WTF with Android Background Restrictions