Paul Lammertsma: Account manager & sync

mdevtalk
mdevtalkmDevTalk
Paul Lammertsma: Account manager & sync
PAUL LAMMERTSMA
CTO, Pixplicity
I’ve been doing
some syncing…
Notion of a “sync adapter”
• Assumes that it transfers data between
device storage and a server
• Assumes your data is associated with an account
• Assumes your server storage requires login access
Sync Adapter
Takes care of:
• Background execution when device has connectivity
• Bundling sync operations between apps
Sync Adapter
• SyncAdapter
• AccountManager
• AccountAuthenticator
Your learning goals
My goals
ListView of blog posts
Fetches data when app is opened
Atom XML feed
(Android Developers Blog)
UI
Network
ze internet
UI
Network
Bad idea #1:
No caching
ze internet
UI
Network
FragmentXActivityA FragmentY
Bad idea #2:
No separation of concerns
Bad idea #1:
No caching
ze internet
UI
Network
ze internet
UI
ContentProvider
Network
ContentResolver.query()
ContentResolver.insert()
ze internet
ContentObserver
UICursorLoader
Network
ContentProvider onCreate(): fetch data
Bad idea #3:
Stale data
Bad idea #4:
Assumes internet connection
ContentResolver.query()
ContentResolver.insert()
ze internet
UICursorLoader
ContentProvider
Service Network
ContentObserver ContentResolver.query()
ContentResolver.insert()
BroadcastReceiver
CONNECTIVITY_CHANGE
Bad idea #5:
Called frequently
Bad idea #6:
Bandwidth/CPU starvation
ze internet
UICursorLoader
ContentProvider
SyncAdapter Network
Android
Framework
ContentObserver ContentResolver.query()
Hey, this would be a great
moment to synchronize!
ContentResolver.insert()
ze internet
Sync Demo
Sync Demo
Android Settings
Android Settings
When you trigger it, for instance because:
• Refresh button was hit
• Local data needs to be sent
• Server data has changed (think GCM)
When the user triggers it through Android settings
Periodically at regular intervals
When does it sync?
UICursorLoader
ContentProvider
SyncAdapter Network
Android
Framework
ContentObserver ContentResolver.query()
Hey, this would be a great
moment to synchronize!
ContentResolver.insert()
ze internet
UICursorLoader
ContentProvider
SyncAdapter Network
ContentObserver ContentResolver.query()
ContentResolver.insert()
SyncService
Binds to service
ze internet
Android
Framework
UICursorLoader
ContentProvider
SyncAdapter Network
ContentObserver ContentResolver.query()
ContentResolver.insert()
SyncService
Binds to service
ze internet
Android
Framework
AccountAuthenticatorService
SyncAdapterSyncService AccountAuthenticatorServiceSyncAdapter
<!-- Required for fetching feed data. -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Required to enable our SyncAdapter after it's created. -->
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<!-- Required because we're manually creating a new account. -->
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
AndroidManifest.xml
AccountAuthenticatorService
SyncAdapterSyncService AccountAuthenticatorService
<service
android:name=".sync.SyncService" />
AndroidManifest.xml
SyncAdapterSyncService AccountAuthenticatorService
<service
android:name=".sync.SyncService"
>
<intent-filter>
<action android:name=" "/>
</intent-filter>
<meta-data
android:name=" "
android:resource=" "/>
</service>
<!-- This service implements our SyncAdapter. It needs to be exported, so that the system
sync framework can access it. -->
<service
android:name=".sync.SyncService"
android:exported="true">
<intent-filter>
<action android:name=" "/>
</intent-filter>
<meta-data
android:name=" "
android:resource=" "/>
</service>
<!-- This service implements our SyncAdapter. It needs to be exported, so that the system
sync framework can access it. -->
<service
android:name=".sync.SyncService"
android:exported="true">
<!-- This intent filter is required. It allows the system to launch our sync service
as needed. -->
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data
android:name=" "
android:resource=" "/>
</service>
<!-- This service implements our SyncAdapter. It needs to be exported, so that the system
sync framework can access it. -->
<service
android:name=".sync.SyncService"
android:exported="true">
<!-- This intent filter is required. It allows the system to launch our sync service
as needed. -->
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<!-- This points to a required XML file which describes our SyncAdapter. -->
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter"/>
</service>
AndroidManifest.xml
SyncAdapterSyncService AccountAuthenticatorService
public class SyncService extends Service {
private SyncAdapter mSyncAdapter = null;
/**
* Creates {@link SyncAdapter} instance.
*/
@Override
public void onCreate() {
super.onCreate();
mSyncAdapter = new SyncAdapter(getApplicationContext(), true);
}
…
SyncService.java
SyncAdapterSyncService AccountAuthenticatorService
…
/**
* Return Binder handle for IPC communication with {@link SyncAdapter}.
*
* <p>New sync requests will be sent directly to the SyncAdapter using this channel.
*
* @param intent Calling intent
* @return Binder handle for {@link SyncAdapter}
*/
@Override
public IBinder onBind(Intent intent) {
return mSyncAdapter.getSyncAdapterBinder();
}
}
SyncService.java
SyncAdapterSyncService AccountAuthenticatorService
• Launched by the system
• Lives as long as the SyncAdapter is running
• Allows system to bind to SyncAdapter
AccountAuthenticatorServiceSyncService SyncAdapter
Android expects you to provide account authentication as part of your sync
adapter
• Plugs into the Android accounts and authentication framework
• Provides a standard interface for handling credentials
AccountAuthenticatorServiceSyncService SyncAdapter
AccountAuthenticatorServiceSyncService SyncAdapter
<!-- This implements the account we'll use as an attachment point for our SyncAdapter. Since
our SyncAdapter doesn't need to authenticate the current user (it just fetches a public
RSS feed), this account's implementation is largely empty. -->
<service android:name=".account.AccountAuthenticatorService">
<!-- Required filter used by the system to launch our account service. -->
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator"/>
</intent-filter>
<!-- This points to an XML file which describes our account service. -->
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator"/>
</service>
AndroidManifest.xml
AccountAuthenticatorServiceSyncService SyncAdapter
public class AccountAuthenticatorService extends Service {
private AccountAuthenticator mAccountAuthenticator;
@Override
public void onCreate() {
mAccountAuthenticator = new AccountAuthenticator(this);
}
@Override
public IBinder onBind(Intent intent) {
return mAccountAuthenticator.getIBinder();
}
}
AccountAuthenticatorService.java
AccountAuthenticatorServiceSyncService SyncAdapter
public class AccountAuthenticator extends AbstractAccountAuthenticator {
public AccountAuthenticator(Context context) {
super(context);
}
// Implement all methods, returning null, 0 or false
…
AccountAuthenticator.java
AccountAuthenticatorServiceSyncService SyncAdapter
…
@Override
public Bundle addAccount(AccountAuthenticatorResponse response,
String accountType, String authTokenType,
String[] requiredFeatures, Bundle options)
throws NetworkErrorException {
Bundle result = new Bundle();
result.putInt(AccountManager.KEY_ERROR_CODE, 0);
result.putString(AccountManager.KEY_ERROR_MESSAGE, "Not supported");
return result;
}
}
AccountAuthenticator.java
AccountAuthenticatorServiceSyncService SyncAdapter
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountPreferences="@xml/account_preferences"
android:accountType="com.example.android.basicsyncadapter.account"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"/>
res/xml/authenticator.xml
SyncAdapterSyncService AccountAuthenticatorService
<sync-adapter
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.example.android.basicsyncadapter.account"
android:allowParallelSyncs="false"
android:contentAuthority="com.example.android.basicsyncadapter"
android:isAlwaysSyncable="true"
android:supportsUploading="false"
android:userVisible="false"/>
res/xml/syncadapter.xml
SyncAdapterSyncService AccountAuthenticatorService
/**
* Define a sync adapter for the app.
*
* <p>This class is instantiated in {@link SyncService}, which also binds SyncAdapter to the
* system. SyncAdapter should only be initialized in SyncService, never anywhere else.
*
* <p>Extending AbstractThreadedSyncAdapter ensures that all methods within SyncAdapter
* run on a background thread, so it is safe to perform blocking I/O here.
*
* <p>The system calls onPerformSync() via an RPC call through the IBinder object supplied by
* SyncService.
*/
public class SyncAdapter extends AbstractThreadedSyncAdapter {
…
SyncAdapter.java
SyncAdapterSyncService AccountAuthenticatorService
/**
* Called by the Android system in response to a request to run the sync adapter. The work
* required to read data from the network, parse it, and store it in the content provider is
* done here.
*
* <p>{@link android.content.AbstractThreadedSyncAdapter} guarantees that this will be called
* on a non-UI thread, so it is safe to perform blocking I/O here.
*
* <p>The syncResult argument allows you to pass information back to the method that triggered
* the sync.
*/
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {}
SyncAdapter.java
On demand
At regular intervals
When does it sync?
Syncing on demand
/**
* Helper method to trigger an immediate sync ("refresh"). This should only be used when we
* need to preempt the normal sync schedule, e.g. the user has pressed the "refresh" button.
*
* <p>SYNC_EXTRAS_MANUAL will cause an immediate sync, without any battery optimization. If
* you know new data is available (perhaps via push), but the user is not waiting for that
* data, omit this flag to give the OS additional freedom in scheduling your sync request.
*/
public static void triggerRefresh() {
Bundle extras = new Bundle();
// Disable sync backoff and ignore sync preferences. In other words...perform sync NOW
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
ContentResolver.requestSync(
account, // Account to sync
FeedContract.CONTENT_AUTHORITY, // Content authority
extras); // Extras
}
Syncing periodically
ContentResolver.addPeriodicSync(
account, CONTENT_AUTHORITY, new Bundle(), pollFrequencyInSeconds);
Yes…
Do I need a ContentProvider?
<sync-adapter
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.example.android.basicsyncadapter.account"
android:allowParallelSyncs="false"
android:contentAuthority="com.example.android.basicsyncadapter"
android:isAlwaysSyncable="true"
android:supportsUploading="false"
android:userVisible="false"/>
<provider
android:name=".provider.FeedProvider"
android:authorities="com.example.android.basicsyncadapter"
android:exported="false"/>
<sync-adapter
android:accountType="com.example.android.basicsyncadapter.account"
android:contentAuthority="com.example.android.basicsyncadapter"
/>
<provider
android:authorities="com.example.android.basicsyncadapter"
/>
Yes… but it doesn’t need to do anything.
Do I need a ContentProvider?
public class DummyProvider extends ContentProvider {
@Override public boolean onCreate() { return false; }
@Override public int delete(...) { return 0; }
@Override public String getType(...) { return null; }
@Override public Uri insert(...) { return null; }
@Override public Cursor query(...) { return null; }
@Override public int update(...) { return 0; }
}
<sync-adapter
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.example.android.basicsyncadapter.account"
android:contentAuthority="com.example.android.basicsyncadapter"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
android:supportsUploading="false"
android:userVisible="false"/>
…
return new Account(accountName, ACCOUNT_TYPE);
<sync-adapter
android:accountType="com.example.android.basicsyncadapter.account"
/>
…
return new Account(accountName, ACCOUNT_TYPE);
Significance of accountType
It is used to identify the account
Usually a username or email
It should not be localized!
If the user switches locale, we would not be able to locate the old account,
and may erroneously register multiple accounts
Beware of the account name
return new Account(accountName, ACCOUNT_TYPE);
SyncAdapters can be used to:
• Fetch background data for an app
• Execute your data transfer code
• at configurable intervals
• while efficiently using battery and other system resources
Recap
Elements of a sync adapter:
• Create a class extending
AbstractThreadedSyncAdapter
• Create two bound Services
which the OS uses
• Define in XML resource files
Recap
• One to initiate a sync
• One to authenticate an account
• Declare them in the app manifest
• One for sync adapter properties
• One for account authenticator properties
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountPreferences="@xml/account_preferences"
android:accountType="com.example.android.basicsyncadapter.account"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"/>
res/xml/authenticator.xml
Bonus: Account preferences
android:accountPreferences="@xml/account_preferences"
Can be used to trigger syncs on demand
Based on:
• Network type
• Charging state
• Device idle state
Can run in the maintenance window of Doze mode**
Bonus: JobScheduler*
* Android 5.0+
** Android 7.0+
Paul Lammertsma: Account manager & sync
https://github.com/Pixplicity/sync-demo
WWW.MDEVTALK.CZ
mdevtalk
1 of 53

Recommended

Sync on Android by
Sync on AndroidSync on Android
Sync on Androidchalup
7.5K views83 slides
Chapter 11 by
Chapter 11Chapter 11
Chapter 11application developer
744 views27 slides
How To Manage API Request with AXIOS on a React Native App by
How To Manage API Request with AXIOS on a React Native AppHow To Manage API Request with AXIOS on a React Native App
How To Manage API Request with AXIOS on a React Native AppAndolasoft Inc
138 views17 slides
Watch How the Giants Fall by
Watch How the Giants FallWatch How the Giants Fall
Watch How the Giants Falljtmelton
540 views127 slides
70562 (1) by
70562 (1)70562 (1)
70562 (1)Pragya Rastogi
2.3K views188 slides
Android Cloud to Device Messaging Framework at GTUG Stockholm by
Android Cloud to Device Messaging Framework at GTUG StockholmAndroid Cloud to Device Messaging Framework at GTUG Stockholm
Android Cloud to Device Messaging Framework at GTUG StockholmJohan Nilsson
516 views29 slides

More Related Content

What's hot

ASP.NET - Life cycle of asp by
ASP.NET - Life cycle of aspASP.NET - Life cycle of asp
ASP.NET - Life cycle of asppriya Nithya
472 views13 slides
Lightning Components Workshop by
Lightning Components WorkshopLightning Components Workshop
Lightning Components WorkshopGordon Bockus
863 views60 slides
API Security - Null meet by
API Security - Null meetAPI Security - Null meet
API Security - Null meetvinoth kumar
2.1K views18 slides
Foreman Single Sign-On Made Easy with Keycloak by
Foreman Single Sign-On Made Easy with KeycloakForeman Single Sign-On Made Easy with Keycloak
Foreman Single Sign-On Made Easy with KeycloakNikhil Kathole
363 views30 slides
13 asp.net session19 by
13 asp.net session1913 asp.net session19
13 asp.net session19Vivek chan
125 views27 slides
Microsoft AZ-204 Exam Dumps by
Microsoft AZ-204 Exam DumpsMicrosoft AZ-204 Exam Dumps
Microsoft AZ-204 Exam DumpsStudy Material
521 views32 slides

What's hot(20)

ASP.NET - Life cycle of asp by priya Nithya
ASP.NET - Life cycle of aspASP.NET - Life cycle of asp
ASP.NET - Life cycle of asp
priya Nithya472 views
Lightning Components Workshop by Gordon Bockus
Lightning Components WorkshopLightning Components Workshop
Lightning Components Workshop
Gordon Bockus863 views
API Security - Null meet by vinoth kumar
API Security - Null meetAPI Security - Null meet
API Security - Null meet
vinoth kumar2.1K views
Foreman Single Sign-On Made Easy with Keycloak by Nikhil Kathole
Foreman Single Sign-On Made Easy with KeycloakForeman Single Sign-On Made Easy with Keycloak
Foreman Single Sign-On Made Easy with Keycloak
Nikhil Kathole363 views
13 asp.net session19 by Vivek chan
13 asp.net session1913 asp.net session19
13 asp.net session19
Vivek chan125 views
Tales of modern day data breaches - a web security guide for developers by Jaap Karan Singh
Tales of modern day data breaches - a web security guide for developersTales of modern day data breaches - a web security guide for developers
Tales of modern day data breaches - a web security guide for developers
Jaap Karan Singh107 views
Remote code-with-expression-language-injection by Mickey Jack
Remote code-with-expression-language-injectionRemote code-with-expression-language-injection
Remote code-with-expression-language-injection
Mickey Jack506 views
Securing APIs with OAuth 2.0 by Kai Hofstetter
Securing APIs with OAuth 2.0Securing APIs with OAuth 2.0
Securing APIs with OAuth 2.0
Kai Hofstetter784 views
Client-side Auth with Ember.js by Matthew Beale
Client-side Auth with Ember.jsClient-side Auth with Ember.js
Client-side Auth with Ember.js
Matthew Beale14.4K views
Streaming twitter data using kafka by Kiran Krishna
Streaming twitter data using kafkaStreaming twitter data using kafka
Streaming twitter data using kafka
Kiran Krishna271 views
An Introduction to OAuth2 by Aaron Parecki
An Introduction to OAuth2An Introduction to OAuth2
An Introduction to OAuth2
Aaron Parecki14.7K views
Android ui layouts ,cntls,webservices examples codes by Aravindharamanan S
Android ui layouts ,cntls,webservices examples codesAndroid ui layouts ,cntls,webservices examples codes
Android ui layouts ,cntls,webservices examples codes
Aravindharamanan S250 views
WP7 HUB_Consuming Data Services by MICTT Palma
WP7 HUB_Consuming Data ServicesWP7 HUB_Consuming Data Services
WP7 HUB_Consuming Data Services
MICTT Palma714 views
AWS Atlanta meetup Build Tools - Code Commit, Code Build, Code Deploy by Adam Book
AWS Atlanta meetup Build Tools - Code Commit, Code Build, Code DeployAWS Atlanta meetup Build Tools - Code Commit, Code Build, Code Deploy
AWS Atlanta meetup Build Tools - Code Commit, Code Build, Code Deploy
Adam Book221 views
Django 1.10.3 Getting started by MoniaJ
Django 1.10.3 Getting startedDjango 1.10.3 Getting started
Django 1.10.3 Getting started
MoniaJ533 views
Claims based authentication in share point 2010 .new by RavikantChaturvedi
Claims based authentication in share point 2010 .newClaims based authentication in share point 2010 .new
Claims based authentication in share point 2010 .new
RavikantChaturvedi525 views
SFDC Inbound Integrations by Sujit Kumar
SFDC Inbound IntegrationsSFDC Inbound Integrations
SFDC Inbound Integrations
Sujit Kumar29 views

Viewers also liked

Developing Android Client Apps via SyncAdapter by
Developing Android Client Apps via SyncAdapterDeveloping Android Client Apps via SyncAdapter
Developing Android Client Apps via SyncAdapterAnatoliy Kaverin
3.1K views23 slides
Hannes Wingate / Recent Work by
Hannes Wingate / Recent Work Hannes Wingate / Recent Work
Hannes Wingate / Recent Work Michael Hebb
183 views1 slide
The world doesn't need another account manager 4 as talk july 2012 by
The world doesn't need another account manager   4 as talk july 2012The world doesn't need another account manager   4 as talk july 2012
The world doesn't need another account manager 4 as talk july 2012Gino Borromeo
4.5K views54 slides
A Practical Guide to Customer Success by
A Practical Guide to Customer SuccessA Practical Guide to Customer Success
A Practical Guide to Customer SuccessJames Cappelli
1K views52 slides
Open Approach to Customer Success by
Open Approach to Customer SuccessOpen Approach to Customer Success
Open Approach to Customer SuccessGuy Nirpaz
1.5K views24 slides
Forrester Research: How the Customer Success Industry is Evolving by
Forrester Research: How the Customer Success Industry is EvolvingForrester Research: How the Customer Success Industry is Evolving
Forrester Research: How the Customer Success Industry is EvolvingGainsight
19.7K views44 slides

Viewers also liked(8)

Developing Android Client Apps via SyncAdapter by Anatoliy Kaverin
Developing Android Client Apps via SyncAdapterDeveloping Android Client Apps via SyncAdapter
Developing Android Client Apps via SyncAdapter
Anatoliy Kaverin3.1K views
Hannes Wingate / Recent Work by Michael Hebb
Hannes Wingate / Recent Work Hannes Wingate / Recent Work
Hannes Wingate / Recent Work
Michael Hebb183 views
The world doesn't need another account manager 4 as talk july 2012 by Gino Borromeo
The world doesn't need another account manager   4 as talk july 2012The world doesn't need another account manager   4 as talk july 2012
The world doesn't need another account manager 4 as talk july 2012
Gino Borromeo4.5K views
A Practical Guide to Customer Success by James Cappelli
A Practical Guide to Customer SuccessA Practical Guide to Customer Success
A Practical Guide to Customer Success
James Cappelli1K views
Open Approach to Customer Success by Guy Nirpaz
Open Approach to Customer SuccessOpen Approach to Customer Success
Open Approach to Customer Success
Guy Nirpaz1.5K views
Forrester Research: How the Customer Success Industry is Evolving by Gainsight
Forrester Research: How the Customer Success Industry is EvolvingForrester Research: How the Customer Success Industry is Evolving
Forrester Research: How the Customer Success Industry is Evolving
Gainsight 19.7K views
SEVEN STEPS TO CUSTOMER SUCCESS AT SCALE by Totango
SEVEN STEPS TO CUSTOMER SUCCESS AT SCALESEVEN STEPS TO CUSTOMER SUCCESS AT SCALE
SEVEN STEPS TO CUSTOMER SUCCESS AT SCALE
Totango10.7K views
Customer Success Strategy Template by OpsPanda
Customer Success Strategy TemplateCustomer Success Strategy Template
Customer Success Strategy Template
OpsPanda42.8K views

Similar to Paul Lammertsma: Account manager & sync

Automatizacion de Procesos en Modelos Tabulares by
Automatizacion de Procesos en Modelos TabularesAutomatizacion de Procesos en Modelos Tabulares
Automatizacion de Procesos en Modelos TabularesGaston Cruz
105 views16 slides
using Mithril.js + postgREST to build and consume API's by
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'sAntônio Roberto Silva
3.6K views67 slides
The complete ASP.NET (IIS) Tutorial with code example in power point slide show by
The complete ASP.NET (IIS) Tutorial with code example in power point slide showThe complete ASP.NET (IIS) Tutorial with code example in power point slide show
The complete ASP.NET (IIS) Tutorial with code example in power point slide showSubhas Malik
11.8K views48 slides
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS) by
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)Amazon Web Services
4.8K views71 slides
Unit 38 - Spring MVC Introduction.pptx by
Unit 38 - Spring MVC Introduction.pptxUnit 38 - Spring MVC Introduction.pptx
Unit 38 - Spring MVC Introduction.pptxAbhijayKulshrestha1
12 views23 slides
Micro services from scratch - Part 1 by
Micro services from scratch - Part 1Micro services from scratch - Part 1
Micro services from scratch - Part 1Azrul MADISA
384 views38 slides

Similar to Paul Lammertsma: Account manager & sync(20)

Automatizacion de Procesos en Modelos Tabulares by Gaston Cruz
Automatizacion de Procesos en Modelos TabularesAutomatizacion de Procesos en Modelos Tabulares
Automatizacion de Procesos en Modelos Tabulares
Gaston Cruz105 views
The complete ASP.NET (IIS) Tutorial with code example in power point slide show by Subhas Malik
The complete ASP.NET (IIS) Tutorial with code example in power point slide showThe complete ASP.NET (IIS) Tutorial with code example in power point slide show
The complete ASP.NET (IIS) Tutorial with code example in power point slide show
Subhas Malik11.8K views
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS) by Amazon Web Services
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)
Build Your Mobile App Faster with AWS Mobile Services (Part 1 - AWS)
Amazon Web Services4.8K views
Micro services from scratch - Part 1 by Azrul MADISA
Micro services from scratch - Part 1Micro services from scratch - Part 1
Micro services from scratch - Part 1
Azrul MADISA384 views
Asp.net state management by priya Nithya
Asp.net state managementAsp.net state management
Asp.net state management
priya Nithya3.5K views
Building microservices sample application by Anil Allewar
Building microservices sample applicationBuilding microservices sample application
Building microservices sample application
Anil Allewar1.3K views
R.A.P. (Rely on Android Platform) by Aditium
R.A.P. (Rely on Android Platform)R.A.P. (Rely on Android Platform)
R.A.P. (Rely on Android Platform)
Aditium1.8K views
AnDevCon - A Primer to Sync Adapters by Kiana Tennyson
AnDevCon - A Primer to Sync AdaptersAnDevCon - A Primer to Sync Adapters
AnDevCon - A Primer to Sync Adapters
Kiana Tennyson4.2K views
C sharp and asp.net interview questions by Akhil Mittal
C sharp and asp.net interview questionsC sharp and asp.net interview questions
C sharp and asp.net interview questions
Akhil Mittal1.2K views
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th... by MongoDB
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...
MongoDB World 2018: Ch-Ch-Ch-Ch-Changes: Taking Your Stitch Application to th...
MongoDB339 views
Agile methodologies based on BDD and CI by Nikolai Shevchenko by Moldova ICT Summit
Agile methodologies based on BDD and CI by Nikolai ShevchenkoAgile methodologies based on BDD and CI by Nikolai Shevchenko
Agile methodologies based on BDD and CI by Nikolai Shevchenko
Understanding router state in angular 7 passing data through angular router s... by Katy Slemon
Understanding router state in angular 7 passing data through angular router s...Understanding router state in angular 7 passing data through angular router s...
Understanding router state in angular 7 passing data through angular router s...
Katy Slemon47 views
Google Cloud Platform monitoring with Zabbix by Max Kuzkin
Google Cloud Platform monitoring with ZabbixGoogle Cloud Platform monitoring with Zabbix
Google Cloud Platform monitoring with Zabbix
Max Kuzkin11.1K views
MongoDB.local Atlanta: Introduction to Serverless MongoDB by MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB276 views
Android Capstone Project, Final Deliverable Documentation by Nate Betz
Android Capstone Project, Final Deliverable DocumentationAndroid Capstone Project, Final Deliverable Documentation
Android Capstone Project, Final Deliverable Documentation
Nate Betz2.7K views
Building Push Triggers for Logic Apps by BizTalk360
Building Push Triggers for Logic AppsBuilding Push Triggers for Logic Apps
Building Push Triggers for Logic Apps
BizTalk3601.7K views

More from mdevtalk

Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu by
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftumdevtalk
110 views44 slides
Jarda Machaň: Proč je dobré míti Developer Evangelistu by
Jarda Machaň: Proč je dobré míti Developer EvangelistuJarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer Evangelistumdevtalk
47 views14 slides
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS by
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSPavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSmdevtalk
133 views25 slides
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr... by
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...mdevtalk
246 views69 slides
Michal Havryluk: How To Speed Up Android Gradle Builds by
Michal Havryluk: How To Speed Up Android Gradle BuildsMichal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle Buildsmdevtalk
437 views31 slides
Vladislav Iliushin: Dark side of IoT by
Vladislav Iliushin: Dark side of IoTVladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoTmdevtalk
141 views43 slides

More from mdevtalk(20)

Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu by mdevtalk
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
mdevtalk110 views
Jarda Machaň: Proč je dobré míti Developer Evangelistu by mdevtalk
Jarda Machaň: Proč je dobré míti Developer EvangelistuJarda Machaň: Proč je dobré míti Developer Evangelistu
Jarda Machaň: Proč je dobré míti Developer Evangelistu
mdevtalk47 views
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS by mdevtalk
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOSPavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
Pavel Cvetler: Jeden kód, co vládne všem? Žádný problém pro Android i iOS
mdevtalk133 views
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr... by mdevtalk
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
Anastasiia Vixentael: 10 things you need to know before implementing cryptogr...
mdevtalk246 views
Michal Havryluk: How To Speed Up Android Gradle Builds by mdevtalk
Michal Havryluk: How To Speed Up Android Gradle BuildsMichal Havryluk: How To Speed Up Android Gradle Builds
Michal Havryluk: How To Speed Up Android Gradle Builds
mdevtalk437 views
Vladislav Iliushin: Dark side of IoT by mdevtalk
Vladislav Iliushin: Dark side of IoTVladislav Iliushin: Dark side of IoT
Vladislav Iliushin: Dark side of IoT
mdevtalk141 views
Georgiy Shur: Bring onboarding to life by mdevtalk
Georgiy Shur: Bring onboarding to lifeGeorgiy Shur: Bring onboarding to life
Georgiy Shur: Bring onboarding to life
mdevtalk112 views
David Bilík: Anko – modern way to build your layouts? by mdevtalk
David Bilík: Anko – modern way to build your layouts?David Bilík: Anko – modern way to build your layouts?
David Bilík: Anko – modern way to build your layouts?
mdevtalk1.9K views
Maxim Zaks: Deep dive into data serialisation by mdevtalk
Maxim Zaks: Deep dive into data serialisationMaxim Zaks: Deep dive into data serialisation
Maxim Zaks: Deep dive into data serialisation
mdevtalk139 views
Nikita Tuk: Handling background processes in iOS: problems & solutions by mdevtalk
Nikita Tuk: Handling background processes in iOS: problems & solutionsNikita Tuk: Handling background processes in iOS: problems & solutions
Nikita Tuk: Handling background processes in iOS: problems & solutions
mdevtalk328 views
Milan Oulehla: Bezpečnost mobilních aplikací na Androidu by mdevtalk
Milan Oulehla: Bezpečnost mobilních aplikací na AndroiduMilan Oulehla: Bezpečnost mobilních aplikací na Androidu
Milan Oulehla: Bezpečnost mobilních aplikací na Androidu
mdevtalk139 views
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů by mdevtalk
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundůTomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
Tomáš Kohout: Jak zrychlit iOS vývoj pomocí Swift playgoundů
mdevtalk117 views
David Vávra: Firebase + Kotlin + RX + MVP by mdevtalk
David Vávra: Firebase + Kotlin + RX + MVPDavid Vávra: Firebase + Kotlin + RX + MVP
David Vávra: Firebase + Kotlin + RX + MVP
mdevtalk1.6K views
Adam Šimek: Optimalizace skrolování, RecyclerView by mdevtalk
Adam Šimek: Optimalizace skrolování, RecyclerViewAdam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerView
mdevtalk135 views
Charles Du: Introduction to Mobile UX Design by mdevtalk
Charles Du: Introduction to Mobile UX DesignCharles Du: Introduction to Mobile UX Design
Charles Du: Introduction to Mobile UX Design
mdevtalk226 views
Honza Dvorský: Swift Package Manager by mdevtalk
Honza Dvorský: Swift Package ManagerHonza Dvorský: Swift Package Manager
Honza Dvorský: Swift Package Manager
mdevtalk497 views
David Bureš - Xamarin, IoT a Azure by mdevtalk
David Bureš - Xamarin, IoT a AzureDavid Bureš - Xamarin, IoT a Azure
David Bureš - Xamarin, IoT a Azure
mdevtalk563 views
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat by mdevtalk
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptatDominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
Dominik Veselý - Vše co jste kdy chtěli vědět o CI a báli jste se zeptat
mdevtalk184 views
Jiří Dutkevič: Ochrana citlivých dat v iOS by mdevtalk
Jiří Dutkevič: Ochrana citlivých dat v iOSJiří Dutkevič: Ochrana citlivých dat v iOS
Jiří Dutkevič: Ochrana citlivých dat v iOS
mdevtalk281 views
Petr Dvořák: Push notifikace ve velkém by mdevtalk
Petr Dvořák: Push notifikace ve velkémPetr Dvořák: Push notifikace ve velkém
Petr Dvořák: Push notifikace ve velkém
mdevtalk292 views

Paul Lammertsma: Account manager & sync