『壹』 如何從技術上全面分析一款android app
一、用戶體驗是王道
1.這是一個看臉的時代,不論是人還是app。
2.Android出現也已經是很長的一段時間了,各種技術相對比較成熟,開源社區里那些圖片庫、網路庫、UI界面、數據框架一抓一大把,在同一個類別的應用中,如果沒點干貨真的很難脫穎而出。誰來判斷干貨,不是研發,不是pm,是用戶。
3.我現在的Leader之前跟我說過一句話,我深以為然--做一款app,其實最核心的是怎麼獲取到用戶,怎麼願意讓用戶去使用你,而不是你應用內的技術怎麼怎麼牛B。不喜勿噴,其實我剛開始的時候也不能理解,但是後來逐漸領悟到他說的竟然是對的。對於移動互聯網來說,app的生生死死真是太常見了,各個公司每年新開的項目一大片,真正能夠活下來的又有幾個。所以在應用的前期還是努力迭代功能,讓自己的app活下去之後,再考慮技術的問題吧
二、應用架構是否合理
1.簡單就一句話,不要重復造輪子,不要重復造輪子,尤其是不要在一個應用里反復造多個輪子。現在的軟體開發早就過了單槍匹馬闖天下的時代了,很多個研發同時工作,難免會造成各自代碼不熟悉,這時候就需要有人能夠將整個應用的架構能夠捋清楚,千萬不要出現項目中我用我的庫方法,你用你的庫方法,大家一起造輪子玩這種情況。
2.能夠使用開源庫就從了他吧。還是那句話,別人造好的輪子,為嘛不用,非得自己造一個,真以為自己是全能嗎?你不累我看著都累啊。
三、內存、網路、界面性能響應優化
其實大家都說過了軟體性能的重要性,我在這里也就不再進行復述了,反正LeakCanary,TraceView等等性能工具,誰用誰知道。
四、單元測試
感覺國內好像很少有研發自己寫單元測試的情況啊,其實我覺得很多時候,研發才是對功能最熟悉的人,很多邊界條件只有在代碼中才能夠恰好遇到,所以寫好單元測試做一隻不麻煩QA的猿才是好猿。
五、安全
Sorry,我對應用安全不是很懂,就是簡單用用Proguard混淆就Over了,加殼什麼的感覺貌似沒有太大必要,畢竟對於很多Android應用而言,其實看一眼大概知道他的界面邏輯了,ui層自己重寫絕對比逆向快,而api介面之類的東西,或許是我不太敏感吧。
『貳』 android 滾輪選擇控制項有哪些框架
android 滾輪選擇控制項是ios獨有的一個控制項,android還沒有原生的,不過網上有一個仿照小米的滾輪字的字的自定義view,你可以到csdn下載頻道搜搜看,是我上傳的
『叄』 android 時間滾輪怎麼把選擇的每個選項合並後轉換成時間戳
1、添加compile:(這個庫里用到了fastjson)
compile 'cn.qqtheme.framework:WheelPicker:1.2.3'
compile 'com.alibaba:fastjson:1.2.18'1212
2、assets文件夾下添加city.json,如下圖:
3、代碼中使用:
/**
* 地區選擇器
*/
private void showRegionPicker() {
try {
final ArrayList<AddressPicker.Province> data = new ArrayList<>();
String json = ConvertUtils.toString(getAssets().open("city.json"));
data.addAll(JSON.parseArray(json, AddressPicker.Province.class));
final AddressPicker picker
『肆』 安卓手機如何在瀏覽網頁時實現滑鼠滾輪的功能
方法步驟(以UC瀏覽器為例)
一、打開瀏覽器,點下面的「三」形圖標。
.
『伍』 android app自動化測試工具有哪些
1、Monkey是Android SDK自帶的測試工具,在測試過程中會向系統發送偽隨機的用戶事件流,如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試,也有日誌輸出。實際上該工具只能做程序做一些壓力測試,由於測試事件和數據都是隨機的,不能自定義,所以有很大的局限性。
2、MonkeyRunner也是Android SDK提供的測試工具。嚴格意義上來說MonkeyRunner其實是一個Api工具包,比Monkey強大,可以編寫測試腳本來自定義數據、事件。缺點是腳本用Python來寫,對測試人員來說要求較高,有比較大的學習成本。
3、Instrumentation是早期Google提供的Android自動化測試工具類,雖然在那時候JUnit也可以對Android進行測試,但是Instrumentation允許你對應用程序做更為復雜的測試,甚至是框架層面的。通過Instrumentation你可以模擬按鍵按下、抬起、屏幕點擊、滾動等事件。Instrumentation是通過將主程序和測試程序運行在同一個進程來實現這些功能,你可以把Instrumentation看成一個類似Activity或者Service並且不帶界面的組件,在程序運行期間監控你的主程序。缺點是對測試人員來說編寫代碼能力要求較高,需要對Android相關知識有一定了解,還需要配置AndroidManifest.xml文件,不能跨多個App。
4、UiAutomator也是Android提供的自動化測試框架,基本上支持所有的Android事件操作,對比Instrumentation它不需要測試人員了解代碼實現細節(可以用UiAutomatorviewer抓去App頁面上的控制項屬性而不看源碼)。基於Java,測試代碼結構簡單、編寫容易、學習成本,一次編譯,所有設備或模擬器都能運行測試,能跨App(比如:很多App有選擇相冊、打開相機拍照,這就是跨App測試)。缺點是只支持SDK 16(Android 4.1)及以上,不支持Hybird App、WebApp。
5、Espresso是Google的開源自動化測試框架。相對於Robotium和UIAutomator,它的特點是規模更小、更簡潔,API更加精確,編寫測試代碼簡單,容易快速上手。因為是基於Instrumentation的,所以不能跨App。配合Android Studio來編寫測試的簡單例子
6、Selendroid:也是基於Instrumentation的測試框架,可以測試Native App、Hybird App、Web App,但是網上資料較少,社區活躍度也不大。
7、Robotium也是基於Instrumentation的測試框架,目前國內外用的比較多,資料比較多,社區也比較活躍。缺點是對測試人員來說要有一定的Java基礎,了解Android基本組件,不能跨App。
8、Athrun是淘寶出的一個移動測試框架/平台,同時支持iOS和Android。Android部分也是基於Instrumentation,在Android原有的類基礎上進行了擴展,提供一整套面向對象的API。這里有詳細介紹。
9、Appium是最近比較熱門的框架,社區也很活躍。這個框架應該是是功能最強大的,
它的優點:
開源;
支持Native App、Hybird App、Web App;
支持Android、iOS、Firefox OS;
Server也是跨平台的,你可以使用Mac OS X、Windows或者Linux;
它的哲理是:
用Appium自動化測試不需要重新編譯App;
支持很多語言來編寫測試腳本,Java、Javascript、PHP、Python、C#、Ruby等主流語言;
不需要為了自動化測試來重造輪子,因為擴展了WebDriver。(WebDriver是測試WebApps的一種簡單、快速的自動化測試框架,所以有Web自動化測試經驗的測試人員可以直接上手);
移動端自動化測試應該是開源的;
它的設計理念:
Client/Server架構,運行的時候Server端會監聽Client端發過來的命令,翻譯這些命令發送給移動設備或模擬器,然後移動設備或模擬器做出響應的反應。正是因為這種架構,所以Client可以使用Appium client libraries多種語言的測試腳本,而且Server端完全可以部署在伺服器上,甚至雲伺服器。
Session,每個Client連接到Server以後都會有一個Session ID,而且Client發送命令到Server端都需要這個Session ID,因為這個seesion id代表了你所打開的瀏覽器或者是移動設備的模擬器。所以你甚至可以打開N個Session,同時測試不同的設備或模擬器。
Desired Capabilities,其實就是一個鍵值對,設置一些測試的相關信息來告訴Server端,我們需要測試iOS、還是Android,或者換是WebApp等信息。
Appium Server是Node.js寫的,所以可以直接用NPM來進行安裝。
Appium Clients,Mac OS和Win下提供GUI,不需要裝Node.js,方便測試人員操作。
相關限制:
如果你在Windows使用Appium,你沒法使用預編譯專用於OS X的.app文件,因為Appium依賴OS X專用的庫來支持iOS測試,所以在Windows平台你不能測試iOS Apps。這意味著你只能通過在Mac上來運行iOS測試。
總結:
在iOS部分是封裝了UIAutomation;Android 4.2以上是用UiAutomator,Android 2.3 ~ 4.1用的是 Instrumentation,也就說Appium同時封裝了UiAutomator和Instrumentation。所以Appium擁有了以上幾大框架的所有優點:跨App,支持Native App、Hybird App、Web App,還支持N種語言來編寫你的測試腳本。
『陸』 Android 時間滾動輪 選擇日期的范圍
可以
xml設置:
<DatePicker
android:id="@+id/dp_date"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_gravity="center_horizontal"
android:calendarViewShown="false"
android:minDate="mm/dd/yyyy"
android:maxDate="mm/dd/yyyy"
/>
mm/dd/yyyy為 月/日/年 如 01/01/2014
或者在代碼中設置:
...
datePicker = (DatePicker)findViewById(R.id.dp_date);
//設置開始日期
//從今天開始
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(Calendar.HOUR, 0);
startCalendar.set(Calendar.SECOND, 0);
startCalendar.set(Calendar.MINUTE, 0);
startCalendar.set(Calendar.MILLISECOND, 0);
datePicker.setMinDate(startCalendar.getTimeInMillis());
//設置結束日期
//到280天後結束
Calendar endCalendar = Calendar.getInstance();
endCalendar.set(Calendar.DATE, startCalendar.get(Calendar.DATE) + 280);
long endDate = endCalendar.getTimeInMillis();
datePicker.setMaxDate(endDate);
...
『柒』 android 輪子是什麼意思
按↓
按↑會壓輪子
有個技巧,開高速摩托時,瘋狂連擊(不是按住)加速會非常快
『捌』 android如何去掉wheelview輪子邊界
/**
* Author: wangjie
* Email: [email protected]
* Date: 7/1/14.
*/
@AILayout(R.layout.main)
public class MainActivity extends AIActivity {
public static final String TAG = MainActivity.class.getSimpleName();
private static final String[] PLANETS = new String[]{"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Uranus", "Neptune", "Pluto"};
@AIView(R.id.main_wv)
private WheelView wva;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wva.setOffset(1);
wva.setItems(Arrays.asList(PLANETS));
wva.setOnWheelViewListener(new WheelView.OnWheelViewListener() {
@Override
public void onSelected(int selectedIndex, String item) {
Logger.d(TAG, "selectedIndex: " + selectedIndex + ", item: " + item);
}
});
}
@AIClick({R.id.main_show_dialog_btn})
public void onClickCallbackSample(View view) {
switch (view.getId()) {
case R.id.main_show_dialog_btn:
View outerView = LayoutInflater.from(context).inflate(R.layout.wheel_view, null);
WheelView wv = (WheelView) outerView.findViewById(R.id.wheel_view_wv);
wv.setOffset(2);
wv.setItems(Arrays.asList(PLANETS));
wv.setSeletion(3);
wv.setOnWheelViewListener(new WheelView.OnWheelViewListener() {
@Override
public void onSelected(int selectedIndex, String item) {
Logger.d(TAG, "[Dialog]selectedIndex: " + selectedIndex + ", item: " + item);
}
});
new AlertDialog.Builder(context)
.setTitle("WheelView in Dialog")
.setView(outerView)
.setPositiveButton("OK", null)
.show();
break;
}
}
}
『玖』 android 輪播列表怎麼實現
第一種:使用動畫的方法實現:
這種發放需要:兩個動畫效果,一個布局,一個主類來實現,
public class IamgeTrActivity extends Activity {
/** Called when the activity is first created. */
public ImageView imageView;
public ImageView imageView2;
public Animation animation1;
public Animation animation2;
public TextView text;
public boolean juage = true;
public int images[] = new int[] { R.drawable.icon, R.drawable.expriment,
R.drawable.changer, R.drawable.dataline, R.drawable.preffitication };
public int count = 0;
public Handler handler = new Handler();
public Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
AnimationSet animationSet1 = new AnimationSet(true);
AnimationSet animationSet2 = new AnimationSet(true);
imageView2.setVisibility(0);
TranslateAnimation ta = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
-1f, Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f);
ta.setDuration(2000);
animationSet1.addAnimation(ta);
animationSet1.setFillAfter(true);
ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1.0f,
Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
0f, Animation.RELATIVE_TO_SELF, 0f);
ta.setDuration(2000);
animationSet2.addAnimation(ta);
animationSet2.setFillAfter(true);
//iamgeView 出去 imageView2 進來
imageView.startAnimation(animationSet1);
imageView2.startAnimation(animationSet2);
imageView.setBackgroundResource(images[count % 5]);
count++;
imageView2.setBackgroundResource(images[count % 5]);
text.setText(String.valueOf(count));
if (juage)
handler.postDelayed(runnable, 6000);
Log.i(handler, handler);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView2 = (ImageView) findViewById(R.id.imageView2);
text=(TextView)findViewById(R.id.text);
text.setText(String.valueOf(count));
//將iamgeView先隱藏,然後顯示
imageView2.setVisibility(4);
handler.postDelayed(runnable, 2000);
}
public void onPause() {
juage = false;
super.onPause();
}
}
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent
android:id=@+id/rl>
android:id=@+id/imageView
android:layout_width=fill_parent
android:background=@drawable/icon
android:layout_below=@+id/rl
android:layout_height=120dp />
android:id=@+id/imageView2
android:layout_width=fill_parent
android:background=@drawable/expriment
android:layout_below=@+id/rl
android:layout_height=120dp />
android:id=@+id/text
android:layout_width=fill_parent
android:layout_height=wrap_content
android:layout_below=@id/imageView/>
第二種:使用ViewFlipper實現圖片的輪播
Android系統自帶的一個多頁面管理控制項,它可以實現子界面的自動切換:
首先 需要為ViewFlipper加入View
(1) 靜態導入:在layout布局文件中直接導入
(2) 動態導入:addView()方法
ViewPlipper常用方法:
setInAnimation:設置View進入屏幕時候使用的動畫
setOutAnimation:設置View退出屏幕時候使用的動畫
showNext:調用該函數來顯示ViewFlipper裡面的下一個View
showPrevious:調用該函數來顯示ViewFlipper裡面的上一個View
setFlipInterval:設置View之間切換的時間間隔
startFlipping使用上面設置的時間間隔來開始切換所有的View,切換會循環進行
stopFlipping:停止View切換
『拾』 android圖片輪播怎麼實現
正常就可以實現的吧,因為這個圖片還是比較輕松的,我都是使用的