android定製開發
1. 如何在Android上開發屬於自己的定製化啟動器
從最基本的概念角度來講,啟動器其實應該是一款能夠實現以下功能的應用程序:
它代表著一台設備的主屏幕。
它能夠列出並啟動已經安裝在該設備當中的應用程序。
換句話來說,它就是那款用戶按下home按鈕後所顯示的應用程序。除非大家已經安裝了定製化啟動器,否則我們目前正在使用的應該都是Android系統自帶的默認啟動方案。不少設備製造商都會在產品中默認使用由其定製的啟動器,從而確保我們獲得與廠商預期相符的外觀效果與使用感受,例如三星TouchWiz以及HTC
Sense。
在今天的教程中,我們將利用基本用戶界面創建出一款簡單的啟動器,它將由兩部分屏幕構成:
在主屏幕中顯示的是該設備的牆紙圖案。
另一屏幕中顯示的是已經安裝在設備當中的應用程序圖標及其它細節信息。
1.要求
大家需要在自己的開發設備上預先安裝並配置好以下項目:
Android SDK以及平台工具
Eclipse IDE 3.7.2或者更高版本,同時具備ADT插件
運行有Android 2.2或者更高版本的模擬器或者Android設備
大家可以點擊此處通過Android開發者門戶下載對應SDK及平台工具。
2.項目設置
首先我們需要啟動Eclipse並創建一個新的Android應用程序項目。我為這個應用取了個非常直白的名稱——SimpleLauncher,當然大家也可以自由選擇自己想要的名稱。請確保軟體包名稱沒有與其它項目出現重復。我們的啟動器所能支持的最低SDK版本為「凍酸奶」,而主要的面向版本則為「果凍豆」。
由於我們不打算創建Activity,因此取消「Create Activity」勾選項,然後點擊「Finish」以繼續。
3.項目清單
接下來我們需要通過添加兩個activity對AndroidManifest.xml文件進行修改。第一個Activity用於顯示主屏幕,我們如下所示將其命名為HomeActivity。
<activity android:name="ah.hathi.simplelauncher.HomeActivity" android:label="Simple Launcher Home" android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:stateNotNeeded="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
通過將android.intent.category.HOME與android.intent.category.DEFAULT兩個類添加至intent-filter組當中,相關Activity得以擁有與啟動器概念相符的運行方式。當大家按下設備上的home按鈕時,其還將作為選項方案顯示出來。
我們還需要將launchMode設置到singleTask當中,從而確保無論何時都只有單一Activity實例由系統負責運行。要顯示用戶的牆紙圖案,大家必須將主題設置為Theme.Wallpaper.NoTitleBar.FullScreen。
我們需要添加的第二個Activity負責顯示已經安裝在用戶設備中的應用程序條目。它還有另一項任務,即啟動這些應用程序。我們不需要對該Activity進行任何特殊配置,將其命名為AppsListActivity即可。
<activity android:name="ah.hathi.simplelauncher.AppsListActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > </activity>
4.Activity布局
下面在項目的res/layout文件夾中為HomeActivity類創建一個XML文件,並將其命名為activity_home.xml。該布局擁有一個單獨的Button用以響應點觸事件。點觸該按鈕能夠讓用戶由主屏幕切換至應用程序列表。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".HomeActivity" > <Button android:id="@+id/apps_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="Show Apps" android:onClick="showApps" /> </RelativeLayout>
接下來,在項目的res/layout文件夾中為AppsListActivity類創建一個XML文件並將其命名為activity_apps_list.xml。該布局當中包含一個占據整個屏幕的ListView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/apps_list" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </LinearLayout>
最後,在同樣的位置創建第三個XML文件並將其命名為list_item.xml。該文件用於定義ListView當中各個條目的布局方案。列表視圖中的每個條目都代表著已經安裝在用戶設備上的一款應用程序。它能夠顯示該應用程序的圖標、標簽以及軟體包名稱。我們可以利用ImageView實例來顯示該應用的圖標,並通過TextView實例顯示標簽與軟體包名稱。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" > <ImageView android:id="@+id/item_app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <TextView android:id="@+id/item_app_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> <TextView android:id="@+id/item_app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_app_label" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> </RelativeLayout>
5.創建Acitivity類
HomeActivity
應用程序的布局方案創建完成之後,現在要做的是創建兩個Activity類。當創建這兩個類時,請確保每個類的名稱都與我們之前在項目清單文件中所指定的內容相匹配。
創建一個名為HomeActivity的新類,然後將android.app.Activity設置為其超類。
package ah.hathi.simplelauncher; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); } public void showApps(View v){ Intent i = new Intent(this, AppsListActivity.class); startActivity(i); } }
在該類的onCreate方法中,我們調用setContentView並將其傳遞至之前已經創建完成的布局當中。大家可能還記得,我們曾為activity_home布局添加過一個按鈕,用於觸發名為showApps的方法。現在我們要做的是將該方法引入HomeActivity類當中。整個添加過程非常簡單,各位需要做的只是為AppsListActivity類創建一個Intent並付諸運行。
2. Android app開發定製會遇到哪些外在的瓶頸
從瓶頸的先後順序列出:
1、技術問題,毫無疑問,各種api總有你不是很了解的,就算你用過下次也有可能有新功能需要有新的方法等
2、架構設計,架構對於小的應用而言通常很少考慮,但當代碼量上w的時候就有必要梳理下了,甚至至少是線設計架構開發程序(一般也是這樣來)。
一個應用正常的開發步驟是,需求分析->分析設計->開發->測試。第一個問題會出現在開發階段,第二個問題會出現在分析設計階段,也就是架構設計
3. 如何在Android上開發屬於自己的定製化啟動器
AppsListActivity
創建另一個名為AppsListActivity的Activity類,而後將android.app.Activity設置為其超類。在該類的onCreate方法當中,我們調用setContentView並將其傳遞至此前已經創建完成的activity_apps_list布局當中。
package ah.hathi.simplelauncher; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class AppsListActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_apps_list); } } 雖然我們的啟動器方案還沒有最終完成,但到這里大家已經可以保存現有內容並藉此啟動自己設備上的應用程序了。當各位按下設備上的home按鈕時,系統會能夠彈窗詢問我們希望使用哪種啟動器方案。
如果大家選擇了Simple Launcher Home,則可以看到自己創建的全新主屏幕,其右上屏幕位置還配備一個按鈕。大家還能看到自己設備上原本設定的牆紙圖案。
現在回到Eclipse並創建一個名為AppDetail的類,其中將包含與應用程序相關的細節信息、軟體包名稱、標簽以及應用程序圖標。該界面非常基礎,大家可以利用如下代碼實現:
package ah.hathi.simplelauncher; import android.graphics.drawable.Drawable; public class AppDetail { CharSequence label; CharSequence name; Drawable icon; } 6.獲取應用程序
在AppsListActivity類的loadApps方法當中,我們可以使用PackageManager類的queryIntentActivities方法以獲取Intent.CATEGORY_LAUNCHER類別當中的所有Intents。該查詢能夠返回一份列表,其中包含全部能夠經由啟動器實現啟動的應用程序。我們可以將查詢返回結果中的每個條目添加到名為apps的列表當中。大家可以通過以下代碼片段進一步了解其效果。
private PackageManager manager; private List<AppDetail> apps; private void loadApps(){ manager = getPackageManager(); apps = new ArrayList<AppDetail>(); Intent i = new Intent(Intent.ACTION_MAIN, null); i.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0); for(ResolveInfo ri:availableActivities){ AppDetail app = new AppDetail(); app.label = ri.loadLabel(manager); app.name = ri.activityInfo.packageName; app.icon = ri.activityInfo.loadIcon(manager); apps.add(app); } } 7.顯示應用程序列表
由於apps變數當中包含有我們所需要的全部細節信息,因此大家可以利用ListView類顯示出完整的應用程序列表。我們首先創建一個簡單的ArrayAdapter並覆蓋其getView方法以獲取列表中的條目信息。接下來,將該ListView與適配器相關聯。
private ListView list; private void loadListView(){ list = (ListView)findViewById(R.id.apps_list); ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, R.layout.list_item, apps) { @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ convertView = getLayoutInflater().inflate(R.layout.list_item, null); } ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon); appIcon.setImageDrawable(apps.get(position).icon); TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label); appLabel.setText(apps.get(position).label); TextView appName = (TextView)convertView.findViewById(R.id.item_app_name); appName.setText(apps.get(position).name); return convertView; } }; list.setAdapter(adapter); } 8.偵聽點觸操作
當用戶點觸ListView當中的某個條目時,我們的啟動器應該能夠運行相應的應用程序。我們可以通過PackageManager類中的getLaunchIntentForPackage方法來創建一個Intent,用於指定我們要啟動哪款應用程序。請大家查看以下代碼片段。
private void addClickListener(){ list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> av, View v, int pos, long id) { Intent i = manager.getLaunchIntentForPackage(apps.get(pos).name.toString()); AppsListActivity.this.startActivity(i); } }); } 9.通過整合實現完整功能
為了讓前面提到的全部內容整合起來並實現完整功能,我們需要在AppsListActivity類的onCreate方法中調用loadApps、loadListView與addClickListener,具體代碼如下所示。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_apps_list); loadApps(); loadListView(); addClickListener(); } 下面編譯並運行我們的啟動器應用,並再一次運行以查看結果。大家現在應該已經能夠在啟動器主屏幕中點擊該按鈕後查看所有可以啟用的應用程序了。別猶豫,快點觸其中一個嘗試一下吧。
4. 如何在Android上開發屬於自己的定製化啟動器
首先我們需要啟動Eclipse並創建一個新的Android應用程序項目。我為這個應用取了個非常直白的名稱——SimpleLauncher,
當然大家也可以自由選擇自己想要的名稱。請確保軟體包名稱沒有與其它項目出現重復。我們的啟動器所能支持的最低SDK版本為「凍酸奶」,而主要的面向版本
則為「果凍豆」。
由於我們不打算創建Activity,因此取消「Create Activity」勾選項,然後點擊「Finish」以繼續。
3.項目清單
接下來我們需要通過添加兩個activity對AndroidManifest.xml文件進行修改。第一個Activity用於顯示主屏幕,我們如下所示將其命名為HomeActivity。
<activity android:name="ah.hathi.simplelauncher.HomeActivity" android:label="Simple Launcher Home" android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:stateNotNeeded="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
通過將android.intent.category.HOME與android.intent.category.DEFAULT兩個類添加至
intent-filter組當中,相關Activity得以擁有與啟動器概念相符的運行方式。當大家按下設備上的home按鈕時,其還將作為選項方案顯
示出來。
我們還需要將launchMode設置到singleTask當中,從而確保無論何時都只有單一Activity實例由系統負責運行。要顯示用戶的牆紙圖案,大家必須將主題設置為Theme.Wallpaper.NoTitleBar.FullScreen。
我們需要添加的第二個Activity負責顯示已經安裝在用戶設備中的應用程序條目。它還有另一項任務,即啟動這些應用程序。我們不需要對該Activity進行任何特殊配置,將其命名為AppsListActivity即可。
<activity android:name="ah.hathi.simplelauncher.AppsListActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > </activity>
4.Activity布局
下面在項目的res/layout文件夾中為HomeActivity類創建一個XML文件,並將其命名為activity_home.xml。該布局擁有一個單獨的Button用以響應點觸事件。點觸該按鈕能夠讓用戶由主屏幕切換至應用程序列表。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".HomeActivity" > <Button android:id="@+id/apps_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="Show Apps" android:onClick="showApps" /> </RelativeLayout>
接下來,在項目的res/layout文件夾中為AppsListActivity類創建一個XML文件並將其命名為activity_apps_list.xml。該布局當中包含一個占據整個屏幕的ListView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/apps_list" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </LinearLayout>
最後,在同樣的位置創建第三個XML文件並將其命名為list_item.xml。該文件用於定義ListView當中各個條目的布局方案。列表視
圖中的每個條目都代表著已經安裝在用戶設備上的一款應用程序。它能夠顯示該應用程序的圖標、標簽以及軟體包名稱。我們可以利用ImageView實例來顯
示該應用的圖標,並通過TextView實例顯示標簽與軟體包名稱。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" > <ImageView android:id="@+id/item_app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <TextView android:id="@+id/item_app_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> <TextView android:id="@+id/item_app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/item_app_label" android:layout_toRightOf="@+id/item_app_icon" android:paddingLeft="10dp" /> </RelativeLayout>
5.創建Acitivity類
HomeActivity
應用程序的布局方案創建完成之後,現在要做的是創建兩個Activity類。當創建這兩個類時,請確保每個類的名稱都與我們之前在項目清單文件中所指定的內容相匹配。
創建一個名為HomeActivity的新類,然後將android.app.Activity設置為其超類。
package ah.hathi.simplelauncher; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class HomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); } public void showApps(View v){ Intent i = new Intent(this, AppsListActivity.class); startActivity(i); } }
在該類的onCreate方法中,我們調用setContentView並將其傳遞至之前已經創建完成的布局當中。大家可能還記得,我們曾為
activity_home布局添加過一個按鈕,用於觸發名為showApps的方法。現在我們要做的是將該方法引入HomeActivity類當中。整
個添加過程非常簡單,各位需要做的只是為AppsListActivity類創建一個Intent並付諸運行。
5. 什麼是Android系統深度優化、定製、開發的第三方手機操作系統
定製操作系統是相對於原生操作系統來說的,某些開源的操作系統,例如Linux和Android允許終端廠商免費使用,終端廠商可以在其基礎上做一些修改,以達到自身的一些目的。
根據對操作系統修改的程度,可以分為一般的定製和深度定製。定製一套自己的UI界面這樣的屬於一般的定製,對原生系統的改動很小,同時也很容易兼容原生應用。有些廠商卻對系統的更深層做了修改。
手機操作系統可以分為內核層、中間層和應用層。基於Linux操作系統進行定製的系統,底層就是Linux系統的內核,中間層包含了名為Dalvik的JAVA虛擬機,應用層則是根據原生系統修改後加入的各種應用。每個應用程序都運行在自己的進程上,享有Dalvik虛擬機為它分配的專有實例。
所謂深度定製,一般是指對中間層做修改,就是修改Dalvik虛擬機的一些設置。例如OMS操作系統集成了大量的增強型中間件,以更好地支持各種應用,並不是簡單復制安卓系統。
那麼為什麼廠商喜歡定製操作系統?因為操作系統本身最大的特點並不是定製,是通用性。而國內廠商無力研發全新的操作系統,或者嘗試研發但是都不夠成功,那麼退而求其次,選擇定製的操作系統來兼容市場上已有的大量應用,同時通過適度修改來滿足自身的應用集成需求,這種選擇是合理的,一定程度上講也是必然的。
6. 如何在Android上開發屬於自己的定製化啟動器
首先需要啟動Eclipse並創建一個新的Android應用程序項目。為這個應用取個非常直白的名稱——SimpleLauncher,當然大家也可以自由選擇自己想要的名稱。請確保軟體包名稱沒有與其它項目出現重復。啟動器所能支持的最低SDK版本為「凍酸奶」,而主要的面向版本則為「果凍豆」。
由於不打算創建Activity,因此取消「Create Activity」勾選項,然後點擊「Finish」以繼續。
3.項目清單
接下來需要通過添加兩個activity對AndroidManifest.xml文件進行修改。第一個Activity用於顯示主屏幕,如下所示將其命名為HomeActivity。
<activity android:name="ah.hathi.simplelauncher.HomeActivity" android:label="Simple Launcher Home" android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:stateNotNeeded="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
通過將android.intent.category.HOME與android.intent.category.DEFAULT兩個類添加至intent-filter組當中,相關Activity得以擁有與啟動器概念相符的運行方式。當大家按下設備上的home按鈕時,其還將作為選項方案顯示出來。
還需要將launchMode設置到singleTask當中,從而確保無論何時都只有單一Activity實例由系統負責運行。要顯示用戶的牆紙圖案,大家必須將主題設置為Theme.Wallpaper.NoTitleBar.FullScreen。
需要添加的第二個Activity負責顯示已經安裝在用戶設備中的應用程序條目。它還有另一項任務,即啟動這些應用程序。不需要對該Activity進行任何特殊配置,將其命名為AppsListActivity即可。
<activity android:name="ah.hathi.simplelauncher.AppsListActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > </activity>
7. android系統定製開發該怎麼上手
就索性進行了一番調研,於是有了本文(本次不討論越獄的iOS) 首先從情感上,你喜歡哪個就好,就像百事可樂和可口可樂,當然這個比喻不是很恰當,因為可樂喝起來幾乎一樣,但是Android和iOS還是有很大差別的。 iOS來源於Apple的OSX,是UNIX系統,OSX已經有差不多10年的歷史,從內核底層到軟體架構都是逐步發展過來的。iOS使用ObjectivC這個古老的語言來做開發。而Android是Google基於Linux搞來的,嚴格意義上講Android並不是一個Linux系統,它沒有Linux的xwin,沒有glibc,缺乏一整套標準的Linux程序。Android應用絕大部分都是使用JAVA開發,跑在Dalvik虛擬機上(一小部分使用NDK)。 Google在底層也修改了很多東西。Android算是一個全新的操作系統。 所以: Android使用JAVA,上手容易很多,如果有很好的JAVA Lib加持,開發效率會高些 iOS沒有虛擬機, 也沒有GC,性能要好一些,當然這個差別會隨著Google的改進越來越小 iOS的開發框架很成熟,而且和MAC上通用,同樣的知識體系,也可以開發MAC應用,Android相比是全新的框架, 還會繼續進化。 iOS和設備緊密集成。軟硬體一家公司通吃。但是Android無法做到, 通常的情況是:Google放出源代碼。 晶元廠商需要1-3個月來做自己的晶元方案, 手機廠商從晶元廠商處買到方案和代碼, 進行自己的集成,定製工作,有時候還需要針對運營商進行定製。 所以: iOS的設備集成度和驅動優化都是最好的。電源管理一塊就可見一斑,而Android廠商就魚龍混雜。可能排頭的廠商的旗艦機器會好些,但是由於Android工期一般都比iOS設備短(請看HTC和三星出機器的速度),所以整體上和iOS比是有差距的。 由於有多家廠商自己做定製,Android還存在設備的分裂問題(fragmentation), 作為過來人,我告訴你這個是很頭痛的事情, 且不論調試時間和人力, 光買一大堆設備的成本就不小。最關鍵的是它會傷美工/UE的心。 iOS是被Apple嚴格控制的系統。 在大部分情況下, 第三方應用是無法拿到所有API的。 這意味系統級別的很多功能只有Apple能做(比如打電話,攔截簡訊)。此外一些涉及用戶隱私的API還會導致系統彈出對話框詢問用戶。 同樣第三方runtime做應用開發也是基本不可行的(Flash當初也是被這個條款拒過)。 反過來Android完全不一樣,首先Android是開源的,在設計上Android就允許自由替換系統組件, Android也沒有強制限制API的情況,(hidden API也可以call,沒有人會找你麻煩)。 系統級別的許可權是下放到廠商手中,如果廠商願意給,那第三方開發者就可以做任何事情。 普通應用的許可權認證也是在安裝的時候就一次性授權完成。 之後不會騷擾用戶。所以: Android平台可以做的事情遠遠比iOS多, 你可以做電話管理,地址簿,簡訊管理,可以自己跑後台service。 替換掉系統的組件非常容易 Android平台也可以跑其他系統的Runtime, 比如Flash, 有了NDK, 你要自己接入一個虛擬機也是可能的。Google不會管你 任何人可以拿Android自己改個獨立的系統出來,也許這樣做的意義和前景有問題,但是同樣,沒有人限制你 iOS上唯一的下載應用途徑就是Appstore,開發者做應用上線還要通過Apple審核,就算通過了,如果掛羊頭賣狗肉亂來或者調用了不該用的API, Apple一樣隨時可以下架。管理非常嚴格。反過來Android上非常鬆懈: 廠商可以內置應用。經常會扔一些莫名其妙的軟體預裝在手機上, 筆者在廠商的時候深刻體會到亂選軟體是很好玩的事情。而且我們不會讓你刪除掉的。 Google的官方菜市場不做應用審核,開發者上傳軟體很隨意,這是個自由市場。 國內還存在大量第三方軟體菜市場。以及豌豆夾類似的PC端管理軟體。 如果用戶選擇允許未知來源,那麼通過web下載或者安裝卡上的軟體也是可以的。似乎國內用戶都是允許的。所以: iOS上的精品軟體多,競爭激烈但管理有序,開發者也容易掙錢。 Android上雖然也有精品軟體,但是垃圾軟體更多, 甚至有惡意軟體。 因為無門檻,基本上軟體都是免費,賣不起錢, 大部分都靠廣告。 Android還有一堆殺毒軟體,這是典型的沒有困難,製造困難也要上的精神。 Android上還有一堆安慰劑軟體,比如能幫你省電的或者是幫你殺後台進程的來提升性能的, 筆者作為做過底層開發的人,笑而不語。 如果你是普通用戶,請關貼, 本文不是用來給普通用戶選機的。 如果你是一個個人軟體開發者, iOS適合你, 市場規范, 做應用省心。 如果你是一個軟體和服務的創業公司, iOS也是適合你做demo的和第一個產品的, 產品靠譜了,用戶在用了,有人給錢了,再往Android走也是可行的。 除非你做的應用要涉及硬體或者需要非常高的系統許可權, 如果是那樣你也只有選擇Android。因為國內的廠商肯定要比蘋果要容易談下來。 如果你是一個要做硬體和系統定製的公司, 那麼基本上你只有Android可以選。Android的解決方案的成本也在不斷下降。 如果你是一個有中國特色的公司,想搞點移動業務玩玩, 還要瞞著用戶做很多事情。 那麼Android也是更好的, 就算你不作惡, 控制權在自己手中也會方便運作一點。所經如何選擇,不用我多講,這兩個都是當今移動互聯網開發的方向,但是一個開源學習起來更容易,做東西更快,有絕對的控制權。一個不開源,只能做上層應用,但也可活的很好,就是這樣。
8. 開發一個android的app需要多少錢
開發一個android的app需要多少錢
如今,不少企業都想擁有屬於自己企業或產品的手機APP,但其中最困擾企業主的問題就是:開發一款手機APP到底需要多少錢?
簡單點來說,要視手機APP的需求及質量而言,價位一般在幾千到十幾萬左右,更高端的價格更高。
固定款的APP開發時間短,約2~3日的時間即可完成,費用大約在幾千到幾萬之間。
定製款:定製款是指APP的功能全部重新開發,過程比較繁瑣,需要美工、策劃、APP開發(前台/客戶端/手機端)、後台程序員等工種協同完成,大型的、功能復雜的APP甚至需要數十人的團隊。
由於APP的功能和設計都是定製的,因此價格會高些。定製款的開發時間與開發價格是成正比的,開發時間長,大約在兩三個月甚至不定的周期里才能完成,而費用大概在幾萬甚至十幾萬左右。
因此,想要知道開發一款手機APP需要花費多少錢,企業主首先必須把APP的詳細需求和功能告知APP開發公司,開發公司才能報出一個合理的價格。
二、手機APP平台不同,製作成本也不一樣
現在市面上流行的手機APP製作平台主要有兩種一般包括兩種系統:安卓系統(Android)和蘋果系統(IOS)。
一般來說,製作蘋果系統的手機APP軟體費用要比安卓平台的貴一些,因為蘋果公司對蘋果平台的封閉性和手機APP開發語言Objective-C的難度,都讓APP開發者加大了蘋果系統手機APP開發的難度。
三、APP製作成本包含參與人員的工資
通常情況下,開發一款APP需要產品經理、客戶端工程師、後端工程師和UI設計師各一名,這已經是製作手機APP應用軟體比較精簡的配置了,所以這些參與人員的工資也是包含在APP製作成本當中的。這些工作人員的月薪加起來可能都會超過4、5萬元。
四、APP開發公司的所在地
需要注意的是,同樣實力的APP開發公司,在不同的城市也會導致APP的成本費用高一些,如在北京、深圳和上海等地的開發公司開發成本費用就會比較高,因為當地開發人員的薪資和其他支出相對更高。
9. Android開發:怎樣定製界面風格
在values目錄下創建styles.xml,然後把風格的名字定義為Widget.TestView。設置背景顏色為白色。
view plain to clipboardprint?
<resources>
<style name=」Widget.TestView」 parent=」android:Widget」>
<item name=」android:background」>#FFFFFFFF</item>
</style>
</resources><span style=」font-style: italic; font-size: 10.5pt; font-family: 『Times New Roman』;」><br></span>
10. 如何在Android上開發屬於自己的定製化啟動器
作為EMM廠商,在管理安卓設備時首先應該能夠緊跟最新技術1、支持標准最新原生安卓系統2、對不同的設備製造商或者系統製造商可以分別簽訂戰略或框架協議,獲得設備簽名,以這種方式擴展3、自己開發一套標准管理介面,說服各個設備製造商或者系統製造商,在設備或系統中預埋自己的介面,形成自己的生態系統上面方法2一般適合從項目出發,因為設備簽名很少會覆蓋特別廣的產品線(人家也不會給)方法2比較適合建立生態系統,你和合作夥伴基本都是一次開發(後續增加或優化),就能達到普及的結果,但是需要在產品層合作,目前有一些EMM廠商已經在做這種生態級的部署了。總的來說,因為涉及到設備管控,而且是企業級的。你得看那些安卓廠商有沒有興趣。這些事都是先花錢後見效果的,急不來,需要時間和錢。希望對你有幫助