SlideShare a Scribd company logo
Intro to Android
for iOS developers
Chiu-Ki Chan
@chiuki
@chiuki@chiuki
@chiuki@chiuki
Hello World
Layouts
Intents & Components
Hello World
@chiuki
@chiuki
ViewController
@chiuki
@chiuki
@chiuki
xib
@chiuki
@chiuki
@chiuki
@chiuki
@chiuki
IBOutlet
@chiuki
@chiuki@chiuki
Center
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
@chiuki
@chiuki@chiuki
Button
<Button
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/add" />
@chiuki
LinearLayout
@chiuki
@chiuki@chiuki
LinearLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="128sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add"
android:onClick="add" />
</LinearLayout>
@chiuki@chiuki
IBAction
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="128sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add"
android:onClick="add" />
</LinearLayout>
@chiuki@chiuki
IBAction
public class MainActivity extends Activity {
private TextView countView;
private int count = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countView = (TextView) findViewById(R.id.count);
updateCount();
}
public void add(View v) {
count += 1;
updateCount();
}
private void updateCount() {
countView.setText(String.valueOf(count));
}
}
android:onClick="add"
@chiuki@chiuki
Update view
public class MainActivity extends Activity {
private TextView countView;
private int count = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countView = (TextView) findViewById(R.id.count);
updateCount();
}
public void add(View v) {
count += 1;
updateCount();
}
private void updateCount() {
countView.setText(String.valueOf(count));
}
}
@chiuki
@chiuki
@chiuki
RelativeLayout
@chiuki
@chiuki
@chiuki
@chiuki
@chiuki
<RelativeLayout>
<TextView
android:id="@+id/count"
android:layout_centerInParent="true" />
<Button
android:id="@+id/reset"
android:layout_below="@id/count"
android:layout_centerHorizontal="true"
android:text="@string/reset" />
<Button
android:layout_below="@id/count"
android:layout_toLeftOf="@id/reset"
android:text="@string/subtract" />
<Button
android:layout_below="@id/count"
android:layout_toRightOf="@id/reset"
android:text="@string/add" />
</RelativeLayout>
@chiuki
<RelativeLayout>
<TextView
android:id="@+id/count"
android:layout_centerInParent="true" />
<Button
android:id="@+id/reset"
android:layout_below="@id/count"
android:layout_centerHorizontal="true"
android:text="@string/reset" />
<Button
android:layout_below="@id/count"
android:layout_toLeftOf="@id/reset"
android:text="@string/subtract" />
<Button
android:layout_below="@id/count"
android:layout_toRightOf="@id/reset"
android:text="@string/add" />
</RelativeLayout>
@chiuki
<RelativeLayout>
<TextView
android:id="@+id/count"
android:layout_centerInParent="true" />
<Button
android:id="@+id/reset"
android:layout_below="@id/count"
android:layout_centerHorizontal="true"
android:text="@string/reset" />
<Button
android:layout_below="@id/count"
android:layout_toLeftOf="@id/reset"
android:text="@string/subtract" />
<Button
android:layout_below="@id/count"
android:layout_toRightOf="@id/reset"
android:text="@string/add" />
</RelativeLayout>
@chiuki
<RelativeLayout>
<TextView
android:id="@+id/count"
android:layout_centerInParent="true" />
<Button
android:id="@+id/reset"
android:layout_below="@id/count"
android:layout_centerHorizontal="true"
android:text="@string/reset" />
<Button
android:layout_toLeftOf="@id/reset"
android:text="@string/subtract" />
<Button
android:layout_below="@id/count"
android:layout_toRightOf="@id/reset"
android:text="@string/add" />
</RelativeLayout>
@chiuki
<RelativeLayout>
<TextView
android:id="@+id/count"
android:layout_centerInParent="true" />
<Button
android:id="@+id/reset"
android:layout_below="@id/count"
android:layout_centerHorizontal="true"
android:text="@string/reset" />
<Button
android:layout_below="@id/count"
android:layout_toLeftOf="@id/reset"
android:text="@string/subtract" />
<Button
android:layout_below="@id/count"
android:layout_toRightOf="@id/reset"
android:text="@string/add" />
</RelativeLayout>
@chiuki@chiuki
Device Preview
@chiuki@chiuki
Bigger text on tablets
Resource Folders
@chiuki@chiuki
textSize
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="128sp" />
res/layout/activity_main.xml
@chiuki@chiuki
res/values/dimens.xml
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/counter_size" />
res/layout/activity_main.xml
<dimen name="counter_size" value="128sp" />
res/values/dimens.xml
@chiuki@chiuki
res/values-sw600dp/dimens.xml
<TextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/counter_size" />
res/layout/activity_main.xml
<dimen name="counter_size" value="128sp" />
<dimen name="counter_size" value="256sp" />
res/values/dimens.xml
res/values-sw600dp/dimens.xml
@chiuki@chiuki
Resource Folders
Type Variation
layout
values
drawable
menu
Language & Region: en, fr, fr-rCA, ja
Screen size: small, large, sw600dp, h400dp
Screen orientation: port, land
Screen density: ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
Platform version: v4, v11, v14
UI mode: car, desk, television, appliance
http://developer.android.com/guide/topics/resources/providing-resources.html
@chiuki@chiuki
Resource Folders
Type Variation
layout
values
drawable
menu
Language & Region: en, fr, fr-rCA, ja
Screen size: small, large, sw600dp, h400dp
Screen orientation: port, land
Screen density: ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
Platform version: v4, v11, v14
UI mode: car, desk, television, appliance
http://developer.android.com/guide/topics/resources/providing-resources.html
res/values-sw600dp/dimens.xml
@chiuki@chiuki
Resource Folders
Type Variation
layout
values
drawable
menu
Language & Region: en, fr, fr-rCA, ja
Screen size: small, large, sw600dp, h400dp
Screen orientation: port, land
Screen density: ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
Platform version: v4, v11, v14
UI mode: car, desk, television, appliance
http://developer.android.com/guide/topics/resources/providing-resources.html
res/drawable-hdpi/ic_launcher.png
@chiuki@chiuki
Resource Folders
Type Variation
layout
values
drawable
menu
Language & Region: en, fr, fr-rCA, ja
Screen size: small, large, sw600dp, h400dp
Screen orientation: port, land
Screen density: ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
Platform version: v4, v11, v14
UI mode: car, desk, television, appliance
http://developer.android.com/guide/topics/resources/providing-resources.html
res/drawable-hdpi/ic_launcher.png
@2x
@chiuki@chiuki
Resource Folders
Type Variation
layout
values
drawable
menu
Language & Region: en, fr, fr-rCA, ja
Screen size: small, large, sw600dp, h400dp
Screen orientation: port, land
Screen density: ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi
Platform version: v4, v11, v14
UI mode: car, desk, television, appliance
http://developer.android.com/guide/topics/resources/providing-resources.html
res/layout-ja/name.xml
Activity Lifecycle
@chiuki@chiuki
onCreate()
Activity Lifecycle
@chiuki@chiuki
onCreate()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
onStop()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
onStop()
viewWillDisappear:
viewDidDisappear:
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
onStop()
viewWillDisappear:
viewDidDisappear:
onDestroy()
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
onStop()
viewWillDisappear:
viewDidDisappear:
onDestroy() viewDidUnload:
Activity Lifecycle
@chiuki@chiuki
onCreate() viewDidLoad:
onStart()
onResume()
viewWillAppear:
viewDidAppear:
onPause()
onStop()
viewWillDisappear:
viewDidDisappear:
onDestroy() viewDidUnload:
Activity Lifecycle
@chiuki@chiuki
Visibility
More Activities
@chiuki@chiuki
startActivity (explicit)
Intent intent = new Intent(this, NumberActivity.class);
intent.putExtra("count", count);
startActivity(intent);
@chiuki@chiuki
startActivity (explicit)
Intent intent = new Intent(this, NumberActivity.class);
intent.putExtra("count", count);
startActivity(intent);
@chiuki@chiuki
startActivity (explicit)
Intent intent = new Intent(this, NumberActivity.class);
intent.putExtra("count", count);
startActivity(intent);
@chiuki@chiuki
startActivity (implicit)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
startActivity (implicit)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
startActivity (implicit)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
startActivity (implicit)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
Register your Activity
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
Info.plist
@chiuki@chiuki
IntentFilter: Action
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
IntentFilter: Data
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
IntentFilter: Category
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
IntentFilter: Category
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://twitter.com/chiuki"));
startActivity(intent);
@chiuki@chiuki
Intent Data
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" android:host="twitter.com" />
  </intent-filter>
</activity>
Uri uri = getIntent().getData();
AndroidManifest.xml
YourActivity.java
@chiuki@chiuki
startActivityForResult
private static final int REQUEST_CODE_CAMERA = 1;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_CAMREA);
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA &&
resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
@chiuki@chiuki
startActivityForResult
private static final int REQUEST_CODE_CAMERA = 1;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA &&
resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
@chiuki@chiuki
Providing Result
Intent data = new Intent();
data.putExtra("data", bitmap);
setResult(RESULT_OK, data);
finish();
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA &&
resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
@chiuki@chiuki
Intent Data
Intent data = new Intent();
data.putExtra("data", bitmap);
setResult(RESULT_OK, data);
finish();
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA &&
resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
@chiuki@chiuki
Result Code
Intent data = new Intent();
data.putExtra("data", bitmap);
setResult(RESULT_OK, data);
finish();
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CAMERA &&
resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
}
}
@chiuki@chiuki
Share intent
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
intent.setType("image/*");
Uri uri = Uri.fromFile(new File(path));
intent.putExtra(Intent.EXTRA_STREAM, uri);
@chiuki@chiuki
IntentFilter: Type
<activity android:name=".YourActivity">
<intent-filter>
   <action android:name="android.intent.action.ACTION_SEND" />
    <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="image/*" />
  </intent-filter>
</activity>
AndroidManifest.xml
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
@chiuki@chiuki
Intent Data
String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
String message = intent.getStringExtra(Intent.EXTRA_TEXT);
Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
YourActivity.java
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, message);
intent.setType("image/*");
Uri uri = Uri.fromFile(new File(path));
intent.putExtra(Intent.EXTRA_STREAM, uri);
Beyond Activities
@chiuki@chiuki
Service BroadcastReceiver
ContentProvider Notification
@chiuki@chiuki
Service
Look ma, no UI!
@chiuki@chiuki
Service
Long-running
@chiuki@chiuki
BroadcastReceiver
Respond
@chiuki@chiuki
BroadcastReceiver
Respond
Battery low
Wifi connected
Incoming SMS
App installed
Screen off
@chiuki@chiuki
ContentProvider
Provide data to other apps
@chiuki@chiuki
ContentProvider
Provide data to other apps
Contacts
Images Music
Calendar
@chiuki@chiuki
ContentProvider
Internal data
(unless you need SQLite interface)
@chiuki@chiuki
Notification
Notify
@chiuki@chiuki
Notify
@chiuki@chiuki
Notification
Communicate with background Service
@chiuki@chiuki
Background Service
Case study
@chiuki
Email Outbox
@chiuki
@chiuki@chiuki
Notification
@chiuki@chiuki
AlarmService
@chiuki@chiuki
Connectivity change
Summary
@chiuki@chiuki
Summary
Hello World
Layouts
Resource Folders
Activity Lifecycle
Intents & Components
Case Study
@chiuki@chiuki
Thank you!
http://eepurl.com/lR5uD
http://blog.sqisland.com
http://twitter.com/chiuki

More Related Content

Similar to Intro to Android for iOS developers (20)

PPTX
Intro to PhoneGap and PhoneGap Build
Chris Griffith
 
PPTX
Android material design lecture #2
Vitali Pekelis
 
PDF
Effective Android UI - English
Pedro Vicente Gómez Sánchez
 
PDF
Basic Introduction Flutter Framework.pdf
PhanithLIM
 
PPT
viWave Study Group - Introduction to Google Android Development - Chapter 23 ...
Ted Chien
 
PDF
Cross Device UI Designing
Deepu S Nath
 
KEY
Fake it 'til you make it
Jonathan Snook
 
PDF
Dreamweaver CS6, jQuery, PhoneGap, mobile design
Dee Sadler
 
PDF
What's new in android 4.4 - Romain Guy & Chet Haase
Paris Android User Group
 
PDF
HTML5 vs Native Android: Smart Enterprises for the Future
Motorola Mobility - MOTODEV
 
PDF
Resume_Haran21 mca
Hariharan Subramanian
 
PPTX
Android Starting App Development
Paramvir Singh
 
PDF
Introduction to flutter
Wan Muzaffar Wan Hashim
 
PPTX
Supporting multi screen in android
rffffffff007
 
PDF
Pivorak.javascript.global domination
Андрей Вандакуров
 
PDF
Andriy Vandakurov about "Frontend. Global domination"
Pivorak MeetUp
 
PPT
Mobile Web Applications using HTML5 [IndicThreads Mobile Application Develop...
IndicThreads
 
PPTX
Accessibility for hybrid mobile
Bobby Bristol
 
PPTX
Flutter
Himanshu Singh
 
KEY
Android Workshop
Junda Ong
 
Intro to PhoneGap and PhoneGap Build
Chris Griffith
 
Android material design lecture #2
Vitali Pekelis
 
Effective Android UI - English
Pedro Vicente Gómez Sánchez
 
Basic Introduction Flutter Framework.pdf
PhanithLIM
 
viWave Study Group - Introduction to Google Android Development - Chapter 23 ...
Ted Chien
 
Cross Device UI Designing
Deepu S Nath
 
Fake it 'til you make it
Jonathan Snook
 
Dreamweaver CS6, jQuery, PhoneGap, mobile design
Dee Sadler
 
What's new in android 4.4 - Romain Guy & Chet Haase
Paris Android User Group
 
HTML5 vs Native Android: Smart Enterprises for the Future
Motorola Mobility - MOTODEV
 
Resume_Haran21 mca
Hariharan Subramanian
 
Android Starting App Development
Paramvir Singh
 
Introduction to flutter
Wan Muzaffar Wan Hashim
 
Supporting multi screen in android
rffffffff007
 
Pivorak.javascript.global domination
Андрей Вандакуров
 
Andriy Vandakurov about "Frontend. Global domination"
Pivorak MeetUp
 
Mobile Web Applications using HTML5 [IndicThreads Mobile Application Develop...
IndicThreads
 
Accessibility for hybrid mobile
Bobby Bristol
 
Android Workshop
Junda Ong
 

More from Chiu-Ki Chan (10)

PDF
Yes, you can draw with your engineering brain
Chiu-Ki Chan
 
PDF
How to be an Android Expert: Women Who Code Connect
Chiu-Ki Chan
 
PDF
how-to-be-an-android-expert-wwcode
Chiu-Ki Chan
 
PDF
How to be an Android Expert: Droidcon Berlin
Chiu-Ki Chan
 
PDF
How to be an Android Expert: Droidcon Boston
Chiu-Ki Chan
 
PDF
How to Write a Conference Proposal
Chiu-Ki Chan
 
PDF
How to be an Android Expert: Android Summit
Chiu-Ki Chan
 
KEY
Hands-on Icon creation
Chiu-Ki Chan
 
KEY
Develop your voice
Chiu-Ki Chan
 
KEY
How to win hackathons, Ignite Google I/O 2012
Chiu-Ki Chan
 
Yes, you can draw with your engineering brain
Chiu-Ki Chan
 
How to be an Android Expert: Women Who Code Connect
Chiu-Ki Chan
 
how-to-be-an-android-expert-wwcode
Chiu-Ki Chan
 
How to be an Android Expert: Droidcon Berlin
Chiu-Ki Chan
 
How to be an Android Expert: Droidcon Boston
Chiu-Ki Chan
 
How to Write a Conference Proposal
Chiu-Ki Chan
 
How to be an Android Expert: Android Summit
Chiu-Ki Chan
 
Hands-on Icon creation
Chiu-Ki Chan
 
Develop your voice
Chiu-Ki Chan
 
How to win hackathons, Ignite Google I/O 2012
Chiu-Ki Chan
 
Ad

Recently uploaded (20)

PPTX
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Ad

Intro to Android for iOS developers