Synopsis emnebeskrivelse

Relaterede dokumenter
Gode praksisser og arkitekturer i Android-programmering. Android - praksisser og arkitekturer Copyright Lund & Bendsen A/S

SYNOPSIS. Analyse & Design for Android-systemet

Hvordan vælger jeg dokumentprofilen?

Android 2.x CodeJam. Android CodeJam 2.x Copyright Lund & Bendsen A/S

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

Version Dato Beskrivelse /11/2012 Initial version /03/2013 Tilføjet eksempel med Template Agent, generelt udvidet dokumentet.

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

A Profile for Safety Critical Java

Kald af PingService via SOAPUI

Digitaliseringsstyrelsen

Tredjepart webservices

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Netværksalgoritmer 1

Bilag 2 Kundens IT-miljø

Løsning af skyline-problemet

Software 1 with Java. Recitation No. 7 (Servlets, Inheritance)

Software Construction 1 semester (SWC) Spørgsmål 1

1.1 Formål Webservicen gør det muligt for eksterne parter, at fremsøge informationer om elevers fravær.

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

Assignment #5 Toolbox Contract

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

Programmering eksamensprojekt - Lectio App

Sikre apps på ios og Android. Mads Jensen & Søren

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Instruktioner i installation og afinstallation af Windows PostScript- og PCLprinterdrivere

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

Databaseadgang fra Java

Aktivering af Survey funktionalitet

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Dynamisk Routing OSPF. Rasmus Elmholt V1.0

Notifikationer i Android

Indhold. Download driver Find version af Windows Hent drivers til Windows Udpak driver... 6

IIS 8.0 & 8.5 & 10.0 SSL Administration

how to save excel as pdf

WIFI koder til Miljøagenturet: Brugernavn: AIACE course Kodeord: TsEG2pVL EU LOGIN KURSUS 21. AUGUST FORMIDDAG:

Aftenskole i programmering sæson Registrering af tid. Sæson 2 - Lektion 5

DK - Quick Text Translation. HEYYER Net Promoter System Magento extension

Dynamisk Routing OSPF. Rasmus Elmholt V1.0

Web- og serverprogrammering

Modern Concurrency Abstractions for C#

Vejledning til WIFI Kamera. Version 2.0

Common Language Runtime. Multithreading

Before you begin...2. Part 1: Document Setup...3. Part 2: Master Pages Part 3: Page Numbering...5. Part 4: Texts and Frames...

Opsætning (GIS udbyder)

Vejledning i opsætning af MQ

IT Support Guide. Installation af netværksprinter (direkte IP print)

Web Admin 5.5. Brugsvejledning for Domain admin. Copyright 2003 Gullestrup.net

Web Services Light. Karen Thomsen. Silkeborg Bibliotek. Karen Thomsen

WINDCHILL THE NEXT STEPS

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

SAX Simple API for XML.

Vilkår for dialogintegration SAPA

PDFmaps på smartphones

Fra idé til virkelig med Azure Mobile Services

E-PAD Bluetooth hængelås E-PAD Bluetooth padlock E-PAD Bluetooth Vorhängeschloss

Installation af Bilinfo på Windows

QUICK MANUAL BRUGERNAVN: ADMIN PASSWORD: APP: SMARTEYES PRO PORT: SecVision - Quick Manual v1.0

Shooting tethered med Canon EOS-D i Capture One Pro. Shooting tethered i Capture One Pro 6.4 & 7.0 på MAC OS-X & 10.8

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Tech College Aalborg. HomePort. Projekt Smart Zenior Home Guide til udvikling af nye adaptere til HomePort

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

SWC Elementer i klassedefinition

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

PID2000 Archive Service

Citrix CSP og Certificate Store Provider

PDFmaps på smartphones

Webservice til upload af produktionstilladelser

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

User Manual for LTC IGNOU

Videregående programmering i Java

Indholdsfortegnelse. Version Serviceplatformen - opsætningsguide (Eksterne testmiljø) Indledning... 2

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Indhold

Ugeseddel 4 1. marts - 8. marts

Hjælp under login på Mit DLR Oktober 2015

HSYCO/ALARMS MANAGER INSTALLATION - TELEGRAM MESSENGER

Indhold. Senest opdateret:03. september Side 1 af 8

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Web Admin 5.5. Brugsvejledning for User admin. Copyright 2003 Gullestrup.net

Dokumentering af umbraco artikeleksport:

Vejledning til at tjekke om du har sat manuel IP på din computer.

MSI pakke til distribution af AutoPilot komponenter.

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

DANSK INSTALLATIONSVEJLEDNING VLMT500 ADVARSEL!

Typo3 Manual TDC Landsklub Kommunikations setup version

Opsætning (GIS udbyder)

SPECIALTRYKKERIETS KUNDE WEBPORTAL KOM GODT I GANG

Introduktion til MeMo

DK-Cartridge 1.0. Distributionsformat for digital læringsindhold VERSION: 1.0

Dokumentation. Udbyder : sms1919.dk Service : sms-grupper Static FBML Facebook. : Facebook Integration med sms-grupper.

FairSSL Fair priser fair support

Orcad Layout kørekort. REV. 1.

Navision Stat (NS 9.2)

En textbox har et Validating event, med dette kan vi samme med en errroprovider checke input:

Transkript:

Synopsis emnebeskrivelse Fag: system integration Navn: Emne: Foreløbig problemformulering: Bjarne hansen Hvordan bruger Android system-integrations-patterns Undersøge hvordan Android systemet bruger design patterns, som er relateret til udveksling af beskeder mellem uafhængige systemer, eller mellem subsystemer indenfor eet system, altså system-integration!. Et af hovedemnerne er undersøgelse af message bus: -bruger Android det, og I så fald hvordan? -Fordele, ulemper ved Androids implementering Hvordan er Intent-mekanismen (Androids implementering af Observer-pattern) implementeret? -Sker der message-filtering for lyttende enheder? Hvad typer message-channels bruges Hvordan fungerer routing Hovedemnerne: Jeg viser at Android Systemet implementerer mange elementer vi har berørt i System Integration kurset, som hører til WebService arkitektur, bla. -SOA-trekantens bestanddele genfindes. -en lidt speciel message-channel mekanisme med centralt styring, message-kø, en slags content-filtrering. -broadcast, point-point. Synopsis hovedtekst: s. 1-7 Bilag s.7-14 Diverse: Jeg har haft stor fornøjelse af undervisningsmateriale her http://grail.cba.csuohio.edu/~matos/notes/cis-493/android- Syllabus.pdf Bjarne Hansen 1/15 System-Integration Synopsis

INTENT-OBJECT ER BASIS FOR MESSAGE-MEKANISME [ ] er optional attributter Action: for ikke-broadcast, udtryk for aktivitet der ønskes udført udføres for broadcast: notification om event, fx battery low [Data]=[URI=reference resource][mimetype] Action og Data er de primære attributter, som er tilstrækkelige i mange tilfælde: ACTION_PHONE_STATE_CHANGED broadcastes af TelephonyManager ved opkald. [Component name]: Eksplicit Modtagernavn. Hvis komponent A skal kalde bestemt modtager komponent B; ofte til intern kommunikation mellem komponenter indenfor én applikation. Hvis ikke angivet (implicit target), laver systemet Intent-Resolution: finder modtager(e) der kan håndtere opgaven, se nedenfor [Category]: fx CATEGORY_BROWSABLE: app kan åbnes som link i browser [Ekstras]: eventuel overførelse af parametre som <key, value> -altså selv-beskrivende som XML, fx BESKEDER SENDES I FORM AF INTENTS på meget simpel måde, som Eks.1, 2 og 3 viser Eks.1. Komponent A-kode (skitsér hvordan A kan få afsendt sms vha ekstern component) Intent intent = new Intent( Intent.ACTION_SENDTO, Uri.parse("sms:5551234")); /* Data= Uri.parse("sms:5551234") */ Intent.putExtra("sms body" "are we playing golf next Saturday?"); /* overføres som selv-beskrivende data, <key,value> */ startactivity(intent); /* A kalder system: find component der afsender sms */ Eks.2 viser kode-del der åbner hjemmeside Intent myintent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.google.com")); startactivity(myintent); Bjarne Hansen 2/15 System-Integration Synopsis

Eks.3 åbner tlf-opkalder-modulet indenfra aktive component Intent myintent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:123 ")); startactivity(myintent); SOA-TREKANTEN simplificeret Service consumer får link til WSDL-dokument hos service-udbyderen fra brokeren. Brokeren(mægleren) skal gerne være et centralt register over mange service-udbyders services, fx som NemHandel. Service beskrives i UDDI-dokument, som har 3 komponenter: 1) kontakt-info til serviceudbyder, 2) services inddeles i kategorier, 3) teknisk info om api til services. INTENT-FILTER ~ WSDL-filen i SOA. Applikationen fremviser/udbyder sine services med AndroidManifest.xml filen, se eksempel i bilag 2 og 3. I filen står også eventuelle permissions-krav for at komponenten kan virke (fx at applikation skal have adgang til kalenderen, gps-info mv), se bilag 3. En applikation kan bestå af 4 typer components: Activity: beregnet til UI, Service: beregnet til give baggrunds-service for andre komponenter BroadcastReceiver: som lytter efter broadcast Bjarne Hansen 3/15 System-Integration Synopsis

ContentProvider: muliggør at app kan dele sine data til eksterne applikationer De 3 første kan alle udbyde service i en SOA-betydning. Når applikation installeres læser systemet AndroidManifest.xml -filen, i en statisk serviceregistrering: - Eventuelle permissions skal accepteres af brugeren ved promp. - service-udbuddet registreres i systemet. -alternativt kan en applikation registrere sine services-udbud dynamisk til systemet. INTENT-RESOLUTION svarer til 2)+3) i SOA-trekanten. Android-systemet virker som broker til at finde modtager(e) til en service-opgave (som kommer til systemet i form af en Intent I) når intet component-name er angivet. Modtager-komponent findes ved følgende test af I op mod IntentFilteret for komponenten, simplificeret forklaret: -Hvis action er specificeret skal den matche en af <action android:name..> -værdierne Skal I fx initialiserer brugerens opstart af en activity, skal action= android.intent.action.main, action= android.intent.action.dial bruges til at aktivere tlf opkald-komponet -Hvis category-værdi(er) er specificeret skal de(n) matche <category..> i filteret, CATEGORY_BROWSABLE betyder fx at komponent med <category android:name="android.intent.category.browsable" /> matches. Brug af category følger faktisk kategori-inddelinger der anvendes I UDDI indenfor SOA. -Hvis [Data]=[URI=reference resource][mimetype] nævnes skal disse matche, mimetype= audio/mpeg kræver simplificeret at modtager-komponent kan håndtere mpeg. Kun hvis alle specifikationer kan matches af mindst et af filter-delkomponenterne kan systemet sende opgaven til denne, opgaven kan så populært sagt passerer ind gennem Intent-filteret. Men det er systemet som fordeler opgaven i sidste ende, en content baseret routing Tilsvarende åbnes med -mekanismen i Windows promptes brugeren for valg af standard applikation for behandling af en bestemt Intent-type første gang. BROADCAST-MEKANISME Ønsker en applikation at modtage besked om system-events, fx battery low, telefons orientering ændret skal den registreres som BroadcastReceiver i Manifest-filen eller under runtime med Bjarne Hansen 4/15 System-Integration Synopsis

registerreceiver metoden; Manifest-filen i bilag 3 har IntentFilter med entry <receiver android:name=" >, vist nedenfor. <!-- broadcast receiver registreres I Manifestfilen: --> <receiver android:name=".mysmsreceiver" android:enabled="true" > <action android:name="android.provider.telephony.sms_received" /> </receiver> Men det er faktisk ikke nødvendigt at medtage i Manifest-filen. Men kan nemlig også registre IntentFilter dynamisk sådan, som jeg lige har testet: IntentFilter filter = new IntentFilter( "android.provider.telephony.sms_received"); registerreceiver(mysmsreceiver, filter); //opstart af service Når der kommer en sms til telefonen, udsender systemet Broadcast med I(action="android.provider.Telephony.SMS_RECEIVED"). Det anbefales at BroadcastReceiver kun tager hånd om simple opgaver, en receiver bør sende krævende opgaver videre til en service. Publisher/subscriber pattern bruges: alle applikationer der registreres til battery low -event kaldes af systemet med deres onreceive(intent:i) metode. Der kan bruges prioriteret rækkefølge med synchron besked med sendorderedbroadcast(), hvor receiverne får besked én af gangen; systemet kan behandle respons fra receiver (har jeg læst et sted), der kan eventuelt overføres data fra den ene broadcast-receiver til den næste i kæden, efter et filterings-pattern. Dette kan ses som Composed Routing composed Message Processor hvor systemet kan virke som ProcessManager og Scatter- Gather-enhed. Alternativt kan bruges asynchron beskeder med sendbroadcast(), hvor rækkefølge er ustyret og flere app faktisk kan behandle eventen samtidigt. Det er altså tale om et system-styret broadcast system, fordele herved: Undgå trafik-kaos på message-channel, mulighed for styret broadcast. Og det er ikke et problem med afhængighed af et centralt styret system (bryder systemet ned er alt jo lige meget!). En applikation der opdager at eventen er indtruffet, fx batteri-måler-app, kan give besked til systemet om at broadcast e eventen videre med sendbroadcast() eller sendorderedbroadcast() kald. LocationManager er ikke broadcast-baseret for ny location, vil givetvis oversvømme system med broadcasts, men udsender notification om nye locationsdata: applikation kan subscribe sømløst til modtage disse. MESSAGE-CHANNEL Bjarne Hansen 5/15 System-Integration Synopsis

Styres af systemet. Request uden modtager-navn går til systemet som videresender til rette komponent. Systemet virker som mellemmand (SOAP kommunikationsformer) En komponent kan dog godt sende direkte til navngiven modtager-komponent (point-point kanal). Det kan både ske synchront (uden retur-respons) og asynchront, hvor callback funktions mekanisme bruges: onactivityresult() kaldes, som det er vist i figuren og bilag1. Figur over Message message kanal, I testes mod filter vha. action, category, Data[URI,mimeType] KØ-MEKANISME FOR BESKEDER Bjarne Hansen 6/15 System-Integration Synopsis

Kø-mekanisme figur. Baggrundstråd Thread1 i app A kan sende besked til app B, 1) først skal app A have en free token med obtainmessage() og dernæst kan A anbringe Intent i Message Queue med 2) sendmessage(). Et Handler object og tilhørende hjælpetråd, fx r1, servicerer køen, B s hovedtråd fortsætter hele tiden, og varetager bla. koordinerede opgaver. Services kan startes og afsluttes med Context.startService() Context.bindService() /* etablerer en egentlig connection */ stopservice( ) and unbindservice( ) KARAKTERISTIKA VED WEBSERVICE -Løs kobling mellem komponenter. Det har Android fx med dynamisk plug & play registrering, man kan fx registrere alternativ sms-service til systemets indbyggede sms-applikation uden anden påvirkning af systemet end at brugeren skal vælge default sms-applikation. Bjarne Hansen 7/15 System-Integration Synopsis

-Messaging på channel(bus), forkert. Men i event-drevet kommunikation kan forretningspartner lytte til events på vores ESB, og det er distribueret service men ikke en service i SOA-trekantforstand. Både simpel content-baseret routing (system router jo afhængig af intent-indhold), men nok også(?) mulighed for composed routing composed Message Processor ved brug af avanceret system-styret broadcasbeskeder(uvigtig bemærkning). Examples of open-source ESB med WebService are Mule and Open ESB. -Kø-mekanisme til service, ja mulighed for det. -Asynchron/synchron kommunikation, ja. -BroadCast (i event-drevet opsætninger vel en form for webservice), ja. -Selv-beskrivende beskeder(typisk med XML-dokumenter), ja på sin vis. Parametre kan overføres som ordnet {<key,value>-collection i som Intent Bundle objekt, se bilag1. -Centralt center for mange webservices, broker-rollen i SOA, som sikrer autentificering og autorisation(godkendt til kunne klare opgaven) for service-udbyder. Det implementeres med system-styret message-kanal. Applikationer fra registrerede App-udbyder, fx GooglePlay, er autenficerede og autoriserede (nej det er de ikke direkte af Google, men brugerkommentarer viser om de kan løse en opgave) før de installeres. Konfidentialitet, at info sendt mellem to parter ikke tilgås af andre, kun bruges til service-formål, er til vis grad sikret, ved at systemet kun sender Intent-besked[uden modtager] til passende modtager. BILAG Bilag 1 Eks 1. Act1_Sender,Act2_Receiver Applikation med to aktiviteter, afsender og modtager, Manifest-filen definerer Intent-filteret Med eksplicit modtager <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.tutorials" android:versioncode="1" android:versionname="1.0"> <uses-sdk android:minsdkversion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".act1_sender" <!-- afsenderen --> android:label="@string/app_name"> Bjarne Hansen 8/15 System-Integration Synopsis

<action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </activity> <activity android:name=".act2_receiver"> <!-- eksplict modtager --> </activity> // </application> </manifest> Act1_Sender.java package android.tutorials; //Activity1: get two input values from user, put them in a bumble. call Activity2 to add the two numbers, show result import android.app.activity; import android.content.intent; import android.os.bundle; //import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.textview; public class Act1_Sender extends Activity { EditText txtval1; EditText txtval2; TextView lblresult; Button btnadd; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main1); txtval1 = (EditText)findViewById(R.id.EditText01); txtval2 = (EditText)findViewById(R.id.EditText02); lblresult = (TextView) findviewbyid(r.id.textview01); btnadd = (Button) findviewbyid(r.id.btnadd); btnadd.setonclicklistener(new OnClickListener() { public void onclick(view v) { //get values from the UI Double v1 = Double.parseDouble(txtVal1.getText().toString()); Double v2 = Double.parseDouble(txtVal2.getText().toString()); //create intent to call Activity2, afsender, explcit modtager) Intent myintenta1a2 = new Intent (Act1_Sender.this, Act2_Receiver.class); //create a container to ship data Bundle mydata = new Bundle(); Bjarne Hansen 9/15 System-Integration Synopsis

//add <key,value> data items to the container mydata.putdouble("val1", v1); mydata.putdouble("val2", v2); //attach the container to the intent myintenta1a2.putextras(mydata); //call Activity2, tell your local listener to wait for response startactivityforresult(myintenta1a2, 101); // med asynchront callback, stemples med id=101 ); //oncreate /////////////////////////////////////////////////////////////////////////// /// // local listener receiving callbacks from other activities @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { super.onactivityresult(requestcode, resultcode, data); try { // control af id-stempel: if ((requestcode == 101 ) && (resultcode == Activity.RESULT_OK)){ Bundle myresults = data.getextras(); Double vresult = myresults.getdouble("vresult"); lblresult.settext("sum is " + vresult); catch (Exception e) { lblresult.settext("problems " + requestcode +" " + resultcode); //onactivityresult //Activity1 Act2_Receiver.java package android.tutorials; import android.app.activity; import android.content.intent; import android.os.bundle; //import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.edittext; import android.widget.textview; public class Act2_Receiver extends Activity { EditText datareceived; Button btndone; @Override Bjarne Hansen 10/15 System-Integration Synopsis

protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main2); datareceived = (EditText) findviewbyid(r.id.etdatareceived); btndone = (Button) findviewbyid(r.id.btndone); //btndone.setonclicklistener(this); //oncreate btndone.setonclicklistener(new OnClickListener(){ public void onclick(view v) { // close current screen terminate Activity2 finish(); ); // pick call made to Activity2 via Intent Intent mylocalintent = getintent(); // look into the bundle sent to Activity2 for data items Bundle mybundle = mylocalintent.getextras(); Double v1 = mybundle.getdouble("val1"); Double v2 = mybundle.getdouble("val2"); // operate on the input data Double vresult = v1 + v2; // for illustration purposes. show data received & result datareceived.settext("data received is \n" + "val1= " + v1 + "\nval2= " + v2 + "\n\nresult= " + vresult); // add to the bundle the computed result mybundle.putdouble("vresult", vresult); // attach updated bumble to invoking intent mylocalintent.putextras(mybundle); // return sending an OK signal to calling activity setresult(activity.result_ok, mylocalintent); // kalder caller::onactivityresult(mylocalintent) Bilag 2 AndroidManifest.xml for en notepad applikation Denne består af de tre Activities: NotesList, NoteEditor, TitleEditor og ContentProvideren NotePadProvider Bjarne Hansen 11/15 System-Integration Synopsis

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.notepad"> <application android:icon="@drawable/app_notes" android:label="@string/app_name" > <provider android:name="notepadprovider" android:authorities="com.google.provider.notepad" /> <activity android:name="noteslist" android:label="@string/title_notes_list"> <!-- viser at denne aktivitet kan opstartes af brugeren --> <action android:name="android.intent.action.main" /> <!-- betyder at appl vises på appl-skærmen --> <category android:name="android.intent.category.launcher" /> <action android:name="android.intent.action.view" /> <action android:name="android.intent.action.edit" /> <action android:name="android.intent.action.pick" /> <category android:name="android.intent.category.default" /> <data android:mimetype="vnd.android.cursor.dir/vnd.google.note" /> <action android:name="android.intent.action.get_content" /> <category android:name="android.intent.category.default" /> <data android:mimetype="vnd.android.cursor.item/vnd.google.note" /> </activity> <activity android:name="noteeditor" android:theme="@android:style/theme.light" android:label="@string/title_note" > <intent-filter android:label="@string/resolve_edit"> <action android:name="android.intent.action.view" /> <action android:name="android.intent.action.edit" /> <action android:name="com.android.notepad.action.edit_note" /> <category android:name="android.intent.category.default" /> <data android:mimetype="vnd.android.cursor.item/vnd.google.note" /> <action android:name="android.intent.action.insert" /> <category android:name="android.intent.category.default" /> <data android:mimetype="vnd.android.cursor.dir/vnd.google.note" /> </activity> <! vist beregnet til at brugeren kan vælge denne applikation som alternativ til systemets indbyggede NotePad program --> <activity android:name="titleeditor" android:label="@string/title_edit_title" android:theme="@android:style/theme.dialog"> <intent-filter android:label="@string/resolve_title"> <action android:name="com.android.notepad.action.edit_title" /> <category android:name="android.intent.category.default" /> Bjarne Hansen 12/15 System-Integration Synopsis

<category android:name="android.intent.category.alternative" /> <category android:name="android.intent.category.selected_alternative" /> <data android:mimetype="vnd.android.cursor.item/vnd.google.note" /> <! beregnet til behandle et emne af datatype som kommer fra contentprovideren vnd.google.note --> </activity> </application> </manifest> Bilag 3 // Registrerer dynamisk broadcast-receiver for sms;, receiveren sender data om modtaget sms til txt_message-box I denne application // jeg er pt. uklar om der skal være entry i Manifest.xml filen på forhånd, umiddelbart ser det ud til at filteret laves dynamisk. Jeg har haft det kørende i min emulator i en lidt anden version import android.app.activity; import android.content.intentfilter; import android.os.bundle; import android.util.log; import android.widget.textview; public class FancySms extends Activity { static TextView txtmsg; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Log.e("bjarne_log", "FancySms::onCreate called"); // udskrives som E i LogCat setcontentview(r.layout.main); txtmsg = (TextView)findViewById(R.id.theMessage); // define instance of local broadcast receiver MySMSReceiver mysmsreceiver = new MySMSReceiver(); // receiver's filter will accept event:...sms_received IntentFilter filter = new IntentFilter( "android.provider.telephony.sms_received"); // tell Android OS this receiver is ready to go registerreceiver(mysmsreceiver, filter); // class // broadcast-receiveren import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.os.bundle; import android.telephony.smsmessage; import android.util.log; Bjarne Hansen 13/15 System-Integration Synopsis

import android.widget.toast; //SMSReceiver: listens to broadcasted SMS_RECEIVED signals public class MySMSReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Log.e("bjarne_log", "onreceive called"); //Android saves in a bundle the current text-message //under name "pdus" and type: Object[]. Later we cast to //SmsMessage[]. Jargon pdu stands for "protocol data unit" Bundle bundle = intent.getextras(); Object messages[] = (Object[]) bundle.get("pdus"); SmsMessage smsmessage[] = new SmsMessage[messages.length]; //Note: long sms are broken and transmitted into various pieces String msg = ""; int smspieces = messages.length; for (int n = 0; n < smspieces; n++) { smsmessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); //grab all pieces of the intercepted sms msg += "\n" + (n + 1) + " -of- " + smspieces + "\n" + "Sender:\t" + smsmessage[n].getoriginatingaddress() + "\n" + "Body: \n " + smsmessage[n].getmessagebody(); " //show first part of intercepted (current) message Toast toast = Toast.makeText(context, "FANCY >>> Received SMS: + smsmessage[0].getmessagebody(), Toast.LENGTH_LONG); toast.show(); FancySms.txtMsg.setText(msg); // class SMSReceiver <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.tutorials" android:versioncode="1" android:versionname="1.0" > <!-- nødvendig user-persmission forspørges(brugeren skal accepterer dette når applikationen installeres: --> <uses-permission android:name="android.permission.receive_sms" /> <uses-sdk android:minsdkversion="15" /> Bjarne Hansen 14/15 System-Integration Synopsis

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".fancysms" android:label="@string/app_name" > <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </activity> <!-- broadcast receiver registreres: --> <receiver android:name=".mysmsreceiver" android:enabled="true" > <action android:name="android.provider.telephony.sms_received" /> </receiver> </application> </manifest> Bjarne Hansen 15/15 System-Integration Synopsis