❶ 有沒有適合 android 開發初學者的 App 源碼推薦
GitHub上google和googlesample這兩個帳號下有若干Android app,大部分都是遵循google推薦的最佳實踐,並且符合Material Design,很值得學習。手機碼字,晚上回去給好連接
首先介紹 iosched這個項目,google/iosched · GitHub 。
iosched項目是Google I/O的官方app,不僅僅是一個學習的demo,這是一個真正開源的線上項目。
這個項目裡面使用了大量Google官方推薦的最佳實踐,比如使用loader載入數據,大量使用本地sqlite緩存數據,通過syncAdapter來更新本地緩存的數據,配合GMS達到節約流量省電的目的。另外這個app也是學些MaterialDesign的不錯的範例。另外這個app還很好的適配了手機和pad,如果你想要做這方面的適配工作,不妨也參考一下
至於項目的committer,你可以找到比如romannurik這種Google Android項目開發者,證實這並不是Google的實習生寫的項目,而是Android平台的核心工程師所做,質量自然很有保證。
第二個推薦的就是topeka項目 googlesamples/android-topeka · GitHub 。
這個項目是Google前幾天剛發出來,用來展示如何將MaterialDesign應用到你的app中,以達到最佳設計和交互效果。通過這個app,你還可以學到如何設計你app的交互和視覺以更好的和MaterialDesign搭配。
❷ 現在到哪獲取android系統源代碼
Android系統源碼都在http://android.git.kernel.org/網址下,其中那個系統app都在platform/packages/apps結構下。
在剛才的Git的shell命名行窗口中輸入下面的命名:
git clone git://android.git.kernel.org/platform/packages/apps/Luancher2.git
你就可以在你的msysGit安裝目錄的git下(~\msysgit\msysgit\git)看到Luancher工程文件夾了。
然後打開~\msysgit\msysgit\git\Luancher2文件夾,就可以看到Android的Luancher系統源碼工程了。
對於其他的app系統源碼的獲取方法和上述的Luancher相同,只是命名行後的參數不同。
git clone git://android.git.kernel.org/需下載源碼的app所在的位置。
❸ 濡備綍浣跨敤Android Studio寮鍙/璋冭瘯Android婧愮爜
android studio瀹夎呭悗闇瑕佸湪eclipse涓瀵煎嚭浠g爜錛屽苟瀵煎叆鍒皊tudio涓鎵嶈兘浣跨敤銆侲clipse榪佺Щ鍒癆ndroid studio姝ラゅ備笅錛
涓銆佷粠Eclipse涓瀵煎嚭錛
1銆佸皢浣犵殑ADT鎻掍歡鐗堟湰鍗囩駭鍒22.0浠ヤ笂銆
2銆佸湪Eclipse涓錛岄夋嫨File-->Export銆
3銆佸湪寮瑰嚭鐨勫煎嚭紿楀彛涓錛屾墦寮Android鐨勬枃浠跺す錛岄夋嫨鈥淕enerate Gradle Build Files鈥濄
4銆侀変腑浣犳兂瑕佸煎叆鍒癆ndroid Studio涓鐨勯」鐩錛孎inish銆
娉ㄦ剰錛氬煎嚭鐨勯」鐩灝嗕細鍜屽師鏉ョ殑欏圭洰鍦ㄥ悓涓鐩褰曪紝瑕嗙洊鍘熸潵鐨勫悓鏃訛紝浼氭柊澧炰竴涓鍙玝uild.gradle鐨勬枃浠訛紝瀵煎叆Android Studio鏃跺皢棣栧厛璇誨彇榪欎釜鏂囦歡銆
浜屻佸煎叆鍒癆ndroid Studio錛
1銆佸湪Android Studio 涓錛岄栧厛鍏蟲帀浣犲綋鍓嶇殑鎵撳紑鐨勯」鐩銆
2銆佸湪嬈㈣繋鐣岄潰錛岀偣鍑籌mport Project錛堟敞錛氫篃鏄鍙浠ョ洿鎺ュ湪鑿滃崟閫夋嫨Import project鐨勶級銆
3銆侀変腑Eclipse涓瀵煎嚭鐨勯」鐩錛屽睍寮鐩褰曪紝鐐瑰嚮build.gradle鏂囦歡錛岀劧鍚嶰K銆
4銆佸湪涔嬪悗鐨勫脊鍑哄硅瘽妗嗕腑錛屼細瑕佹眰浣犻夋嫨Gradle鐨勯厤緗錛岄変腑Use gradle wrapper.(娉錛氫篃鍙浠ヨ嚜瀹氫箟浣犳湰鏈鴻呯殑Gradle)銆
娉ㄦ剰錛氬傛灉娌℃湁Grade build鏂囦歡錛屼篃鏄鍙浠ュ皢鏅閫氱殑瀹夊崜欏圭洰瀵煎叆鍒癆ndroid Studio涓錛屽畠浼氱敤鐜版湁鐨凙nt build.浣嗕負浜嗘洿濂藉湴浣跨敤涔嬪悗鐨勫姛鑳藉拰鍏呭垎浣跨敤鏋勫緩鍙橀噺錛岃繕鏄寮虹儓鍦板緩璁鍏堜粠ADT鎻掍歡涓鐢熸垚Gradle鏂囦歡鍐嶅煎叆Android Studio銆
❹ 基於Android音樂播放器源代碼(正常播放、有列表)
package my.android.players;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
public class mainActivity extends Activity {
private List<String> myMusicList=new ArrayList<String>();
//當前播放歌曲的索引
private int currentListItem=0;
//音樂的路徑
private static final String MUSIC_PATH="/sdcard/mp3";
//播放對象
private MediaPlayer myMediaPlayer;
private TextView m_TextView;
//播放按鈕
private ImageButton m_start;
private ImageButton m_stop;
private ImageButton m_next;
private ImageButton m_last;
/*設定bIsPaused一開始為false */
private boolean bIsRun = false;
private boolean isplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
myMediaPlayer=new MediaPlayer();
musicList();
m_TextView=(TextView)findViewById(R.id.mtextview);
m_start=(ImageButton)findViewById(R.id.imgbtn_start);
m_stop=(ImageButton)findViewById(R.id.imgbtn_stop);
m_next=(ImageButton)findViewById(R.id.imgbtn_next);
m_last=(ImageButton)findViewById(R.id.imgbtn_last);
listener();
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
currentListItem = bundle.getInt("currentListItem");
isplay=bundle.getBoolean("isplay");
if(isplay==true)
{
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
}
//監聽事件
void listener(){
//開始
m_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try
{
if(myMediaPlayer.isPlaying()==true)
{
myMediaPlayer.pause();
m_start.setImageResource(R.drawable.pause);
}
else
{
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
}
catch (IllegalStateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//下一首
m_next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
nextMusic();
}
});
//上一首
m_last.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
lastMusic();
}
});
//停止
m_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopMusic();
}
});
myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
nextMusic();
}
});
}
//播放音樂
void playMusic(String path){
try {
if(bIsRun==false)
{
myMediaPlayer.reset();
myMediaPlayer.setDataSource(path);
myMediaPlayer.prepare();
myMediaPlayer.start();
/*
* 取出歌曲名的.mp3後綴
* */
String str=(myMusicList.get(currentListItem)).toString();
System.out.println(str);
String str1[]=str.split("\\.");
System.out.println(str1[0]);
m_TextView.setText(str1[0]);
}
else
{
myMediaPlayer.start();
}
m_start.setImageResource(R.drawable.start);
bIsRun=true;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//下一首
void nextMusic(){
if(++currentListItem>=myMusicList.size()){
currentListItem=0;
}
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
//上一首
void lastMusic(){
if(--currentListItem<0)
currentListItem=myMusicList.size()-1;
bIsRun=false;
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
//停止
void stopMusic() {
if (myMediaPlayer.isPlaying()) {
m_start.setImageResource(R.drawable.pause);
myMediaPlayer.stop();// 停止
bIsRun=false;
}
else
playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));
}
//當用戶返回時結束音樂並釋放音樂對象
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
new AlertDialog.Builder(mainActivity.this).setTitle("message")
.setIcon(android.R.drawable.dialog_frame)
.setMessage("你確定要離開嗎?")
.setPositiveButton("確定",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
myMediaPlayer.stop();
myMediaPlayer.release();
finish();
}
}).setNegativeButton("取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).show();
}
return super.onKeyDown(keyCode, event);
}
/**
* 文件過濾器
*
* @author
*
*/
class MusicFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String filename) {
return (filename.endsWith(".mp3"));
}
}
//綁定音樂
void musicList(){
try{
File home=new File(MUSIC_PATH);
if(!home.exists())
home.mkdirs();
if(home.listFiles(new MusicFilter()).length>=0){
for(File file:home.listFiles(new MusicFilter())){
myMusicList.add(file.getName().toString());
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
package my.android.players;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class Activity01 extends Activity {
//播放列表
private List<String> myMusicList=new ArrayList<String>();
//當前播放歌曲的索引
private int currentListItem;
//音樂的路徑
private static final String MUSIC_PATH="/sdcard/mp3";
//播放列表
private ListView m_ListView;
private boolean isplay=true;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_ListView=(ListView)findViewById(R.id.lv_music);
musicList();
//當選擇列表項時播放音樂
m_ListView.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
currentListItem = arg2;
Intent intent = new Intent();
Bundle mBundle=new Bundle();
mBundle.putInt("currentListItem", currentListItem);
mBundle.putBoolean("isplay", isplay);
intent.putExtras(mBundle);
intent.setClass(Activity01.this,mainActivity.class);
startActivity(intent);
finish();
}
});
}
/**
* 文件過濾器
*
* @author
*
*/
class MusicFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String filename) {
return (filename.endsWith(".mp3"));
}
}
//綁定音樂
void musicList(){
try{
File home=new File(MUSIC_PATH);
if(!home.exists())
home.mkdirs();
if(home.listFiles(new MusicFilter()).length>=0){
for(File file:home.listFiles(new MusicFilter())){
myMusicList.add(file.getName().toString());
}
ArrayAdapter<String> musicList=new ArrayAdapter<String>
(Activity01.this,android.R.layout.simple_list_item_1, myMusicList);
m_ListView.setAdapter(musicList);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
❺ 如何使用Android Studio開發/調試Android源碼
本文是以源碼中development/tools/idegen/README作為指導文檔.
環境: Ubuntu 14.10,openJdk 1.7,Android Studio 1.0.2,android-5.0.1_r1源碼
由於AS是基於IntelliJ IDEA開發的,所以本文也適用於IntelliJ IDEA
一、修改Android Studio(以下簡稱AS)的內存配置
因為在導入源碼時需要消耗大量內存,所以先修改IDEA_HOME/bin/studio.vmoptions中-Xms和-Xmx的值。文檔中使用的是748m,可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一個沒有classpath的JDK,這樣可以確保使用源碼里的庫文件
在彈出的選擇進程(Choose Process)對話框中,勾選顯示所有進程,選擇要DEBUG的代碼所在的進程,點擊OK即可.
六、其它
代碼中很多地方提示CallrequiresAPILevelx.... 出現這個問題是因為AS將我們的工程當做安卓應用程序工程了,且源碼中沒有指定minSdkVersion.
我們只需在源碼根目錄加一個聲明minSdkVersion的AndroidManifest.xml文件即可(分享了一個AndroidManifest.xml)。
也可以考慮使用build.gradle來解決該問題。
❻ Android源碼追蹤—android:onClick
之前對源碼的閱讀,總是用時一通亂七八糟的跳轉,以學會使用為目的;過了一段時間,就忘記了,因此打算將一些源碼的閱讀經歷記錄下來,也通過敲一遍的過程,加深理解。
最開始,用一個比較簡單的例子來小試牛刀吧
對於View(Button、TextView等)的點擊事件,常用的寫法是通過 findViewById 獲取View的實例,然後通過 setOnClickListener 設置監聽事件,比如我們有如下Button控制項。
設置點擊事件(假設在Activity中)
但是還有一種寫法是在xml布局中通過android:onClick屬性直接指定點擊執行的函數。
【思考】
首先我們知道諸如 android:xxx 之類的屬性是會在某個attrs文件中定義的,此處的 android:onClick 是View的屬性,定義在如下文件中。
在View的構造函數中,會解析出此屬性的值。
看這里, 如果變數handlerName不為空,就會為此View設置點擊事件了 ,這個handlerName就是onClick屬性的值doSubmit,但這個點擊事件,並不是我們所熟悉的OnClickListener。
進一步看看這個 DeclaredOnClickListener 類
DeclaredOnClickListener 實現了 OnClickListener ,其中重點是參數 mResolvedMethod 和 mResolvedContext 。
在onClick事件中最終通過反射 mResolvedMethod.invoke(mResolvedContext, v); 執行了doSubmit方法。
doSubmit的訪問許可權是否可以設置為private呢?
答案:不可以,因為源碼中沒有調用 mMethod.setAccessible(true); 注入所有修飾符。
其實在onClick屬性的注釋中就已經說明了。
❼ 如何獲取android源代碼
當前的Android代碼託管在兩個方:https://github.com/android 和https://android.googlesource.com之前在 android.git.kernel.org上也有託管,不過現在重定向到了https://android.googlesource.com好在都支持git訪問。
google提供的repo工具實際上是一個內部操作git工具來簡化操作Android源碼的Python腳本。經過嘗試,直接使用git工具在ubuntu下可以實現cloneAndroid源碼。下面介紹一下方法:
1.獲取當前的在github上託管的Androidgitrepositories:
github頁面為:https://github.com/android/following。不過這個頁面不支持通過wget"https://github.com/android/following"或者curl"https://github.com/android/following"的方式訪問,錯誤信息如下:
這個時候需能做的只能是"tryagain"了。
需要說明的是"不要試圖同時並發執行多個gitclone命令",這樣會導致大量出現上面貼圖中的錯誤,另外,整個clone過程中耗時最多的gitrepository如下:
kernel_common.gitkernel_msm.gitplatform_frameworks_base.gitplatform_prebuilt.git其中platform_prebuilt.git是google提供的預編譯好的二進制文件,包含:各種庫文件,jar包,可執行程序等等,如果只是閱讀Android源代碼,這個gitrepository可以不用clone.
❽ 怎麼運用Git來獲取android源代碼
下載Git工具:(默認安裝即可,我自己是安裝在D:\AndroidSrc\Git目錄下):
安裝完成之後,雙擊桌面的Git bash圖標:
雙擊出現如下命令窗口,並輸入cd /c/
android/source(因為我是選擇把android源代碼下載到這裡面具體情況你可以根據自己的需要來決定),出現如下界面:
初始化目錄,使用命令:git init ,然後從遠程伺服器下載git:
git fetch http://android.git.kernel.org/ + project path.git
並且輸入我要下在的base這個部分的代碼:git fitch
http://android.git.kernel.org/platformworks/base.git
出現如下界面:
出現這個肯定下載不了的,為什麼呢?我去android官網去看了一下,原來不是用老版本的那個命令了,而是如下的命令:
因此我要下載的base這個源代碼,找到相應的目錄,看下圖中的最後一個目錄:我用命令:
於是我用:git clone
https://android.googlesource.com/platform/frameworks/base.git
命令來下載base部分的源代碼,具體的界面如下:
然而居然出現HTTP
服務請求失敗,所以自己果把https換成http(我想大多數的朋友在eclipse中在線安裝ADT插件的時候,也會碰到類似的問題,這里就不一一詳述了):
輸入命令:git clone
http://android.googlesource.com/platform/frameworks/base.git
出現如下界面:
結果成功下載了base這個部分的代碼:現在看看我的C盤相應目錄中多出的base這個文件夾:
結果就成功了,你要下載其他部分的源代碼,依葫蘆畫瓢就OK了,希望能幫到學習android的朋友。
❾ 鎬庢牱鏌ョ湅 Android APP婧愪唬鐮
瑕佹煡鐪婣ndroid APP鐨勬簮浠g爜錛屼綘鍙浠ラ氳繃浠ヤ笅鍑犵嶆柟娉曪細
1. 浠庡紑婧愬鉤鍙拌幏鍙栵細濡傛灉APP鏄寮婧愮殑錛屼綘鍙浠ュ湪濡侴itHub銆丟itLab絳変唬鐮佹墭綆″鉤鍙頒笂鎼滅儲璇APP鐨勬簮浠g爜銆
2. 浣跨敤鍙嶇紪璇戝伐鍏鳳細瀵逛簬闈炲紑婧愮殑APP錛屼綘鍙浠ュ皾璇曚嬌鐢ㄥ弽緙栬瘧宸ュ叿濡侫pktool鍜孞D-GUI鏉ュ弽緙栬瘧APK鏂囦歡銆傝繖浜涘伐鍏峰彲浠ュ皢APK鏂囦歡杞鎹涓哄彲璇葷殑婧愪唬鐮佸艦寮忥紝浣嗚鋒敞鎰忥紝鍙嶇紪璇戝緱鍒扮殑浠g爜鍙鑳戒笉瀹屽叏絳夊悓浜庡師濮嬫簮浠g爜錛屼笖鍙鑳藉寘鍚緙栬瘧鍜屼紭鍖栧悗鐨勪唬鐮併
3. 鍒╃敤璋冭瘯宸ュ叿錛氬傛灉浣犳嫢鏈堿PP鐨凙PK鏂囦歡錛屽苟涓斿笇鏈涘湪榪愯屾椂鏌ョ湅婧愪唬鐮侊紝浣犲彲浠ヤ嬌鐢ˋndroid Studio鐨勮皟璇曞姛鑳姐傞氳繃璋冭瘯錛屼綘鍙浠ュ湪APP榪愯屾椂鏌ョ湅鍜屼慨鏀逛唬鐮侊紝浣嗚繖闇瑕佷竴瀹氱殑緙栫▼鐭ヨ瘑鍜岀粡楠屻
4. 鑱旂郴寮鍙戣咃細濡傛灉浣犲規煇涓獮PP鐨勬簮浠g爜鎰熷叴瓚o紝浣嗘棤娉曢氳繃浠ヤ笂鏂規硶鑾峰彇錛屼綘鍙浠ュ皾璇曡仈緋誨紑鍙戣呮垨寮鍙戝洟闃燂紝璇㈤棶浠栦滑鏄鍚︽効鎰忓垎浜婧愪唬鐮併傛湁浜涘紑鍙戣呭彲鑳戒細鎰挎剰鍒嗕韓浠栦滑鐨勪唬鐮侊紝鐗瑰埆鏄瀵逛簬閭d簺鏁欒偛鎴栫爺絀剁洰鐨勭殑璇鋒眰銆
鍦ㄦ煡鐪婣ndroid APP婧愪唬鐮佹椂錛岃風『淇濅綘閬靛畧鐩稿叧鐨勬硶寰嬪拰閬撳痙瑙勮寖銆傛湭緇忚稿彲鐨勮幏鍙栧拰浣跨敤浠栦漢鐨勬簮浠g爜鍙鑳戒鏡鐘鐭ヨ瘑浜ф潈錛屽洜姝よ風『淇濅綘鐨勮屼負鍚堟硶鍚堣勩傚悓鏃訛紝浜嗚В婧愪唬鐮佸苟涓嶆剰鍛崇潃浣犲彲浠ラ殢鎰忎慨鏀瑰拰鍒嗗彂APP錛岄櫎闈炰綘鑾峰緱浜嗗紑鍙戣呯殑鏄庣『鎺堟潈銆
鎬諱箣錛屾煡鐪婣ndroid APP婧愪唬鐮佺殑鏂規硶鍥燗PP鐨勫紑婧愭儏鍐佃屽紓銆傚逛簬寮婧怉PP錛屼綘鍙浠ョ洿鎺ヤ粠浠g爜鎵樼″鉤鍙拌幏鍙栨簮浠g爜錛涘逛簬闈炲紑婧怉PP錛屼綘鍙浠ュ皾璇曚嬌鐢ㄥ弽緙栬瘧宸ュ叿鎴栬皟璇曞伐鍏鋒潵鏌ョ湅婧愪唬鐮侊紱褰撶劧錛屼綘涔熷彲浠ヨ仈緋誨紑鍙戣呭繪眰甯鍔┿傛棤璁洪噰鐢ㄥ摢縐嶆柟娉曪紝閮借風『淇濅綘鐨勮屼負鍚堟硶鍚堣勶紝騫跺皧閲嶄粬浜虹殑鐭ヨ瘑浜ф潈銆