Lab - Intents

启动程序

    private void startExplicitActivation() {
Log.i(TAG,"Entered startExplicitActivation()");
// TODO - Create a new intent to launch the ExplicitlyLoadedActivity class
Intent intent=new Intent(ActivityLoaderActivity.this, ExplicitlyLoadedActivity.class);
startActivityForResult(intent, 0);
// TODO - Start an Activity using that intent and the request code defined above
}
private void startImplicitActivation() {

        Log.i(TAG, "Entered startImplicitActivation()");

        // TODO - Create a base intent for viewing a URL
// (HINT: second parameter uses parse() from the Uri class)
Uri webpage = Uri.parse("http://www.google.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); // TODO - Create a chooser intent, for choosing which Activity
// will carry out the baseIntent. Store the Intent in the
// chooserIntent variable below. HINT: using the Intent class'
// createChooser Intent chooserIntent = Intent.createChooser(webIntent, "CHOOSER");
Log.i(TAG,"Chooser Intent Action:" + chooserIntent.getAction());
// TODO - Start the chooser Activity, using the chooser intent
startActivity(chooserIntent);
}

关联程序

        <activity
android:name=".MyBrowserActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
</intent-filter> <!-- TODO - Add necessary intent filter information so that this
Activity will accept Intents with the
action "android.intent.action.VIEW" and with an "http"
schemed URL -->
</activity>

Lab - Permissions

读取书签--使用权限

<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>
private void loadBookmarks() {

        Log.i(TAG, "Entered loadBookmarks()");

        String text = "";

        Cursor query = getContentResolver().query(Browser.BOOKMARKS_URI,
projection, null, null, null); query.moveToFirst();
while (query.moveToNext()) { text += query.getString(query
.getColumnIndex(Browser.BookmarkColumns.TITLE));
text += "\n";
text += query.getString(query
.getColumnIndex(Browser.BookmarkColumns.URL));
text += "\n\n"; } TextView box = (TextView) findViewById(R.id.text);
box.setText(text); Log.i(TAG, "Bookmarks loaded");
}

自定义权限

    <permission android:name="course.labs.permissions.DANGEROUS_ACTIVITY_PERM" android:protectionLevel="dangerous"></permission>

    <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > <!-- TODO - enforce the custom permission on this Activity --> <activity
android:name=".DangerousActivity"
android:label="@string/app_name" > <!--
TODO - add additional intent filter info so that this Activity
will respond to an Implicit Intent with the action
"course.labs.permissions.DANGEROUS_ACTIVITY"
--> <intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="course.labs.permissions.DANGEROUS_ACTIVITY"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

Lab - The Fragment Class

主activity定义layout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

添加fragment

        mFriendsFragment = new FriendsFragment();

            //TODO 1 - add the FriendsFragment to the fragment_container
FragmentTransaction a=getFragmentManager().beginTransaction();
a.add(R.id.fragment_container,mFriendsFragment);
a.commit();

替换fragment

//TODO 2 - replace the fragment_container with the FeedFragment

            getFragmentManager().beginTransaction().replace(
R.id.fragment_container, mFeedFragment).commit(); // execute transaction now
getFragmentManager().executePendingTransactions();

// Update Twitter feed display on FriendFragment
mFeedFragment.updateFeedDisplay(position);

判断fragment状态

// If there is no fragment_container ID, then the application is in
// two-pane mode private boolean isInTwoPaneMode() { return findViewById(R.id.fragment_container) == null; }

Lab - User Interface Classes

用户设定日期

    public static class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener { @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH); // Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
} @Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
setDateString(year, monthOfYear, dayOfMonth); dateView.setText(dateString);
} } private void showDatePickerDialog() {
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getFragmentManager(), "datePicker");
} private static void setDateString(int year, int monthOfYear, int dayOfMonth) { // Increment monthOfYear for Calendar/Date -> Time Format setting
monthOfYear++;
String mon = "" + monthOfYear;
String day = "" + dayOfMonth; if (monthOfYear < 10)
mon = "0" + monthOfYear;
if (dayOfMonth < 10)
day = "0" + dayOfMonth; dateString = year + "-" + mon + "-" + day;
}

用户设定时间

    // DialogFragment used to pick a ToDoItem deadline time

    public static class TimePickerFragment extends DialogFragment implements
TimePickerDialog.OnTimeSetListener { @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE); // Create a new instance of TimePickerDialog and return
return new TimePickerDialog(getActivity(), this, hour, minute,
true);
} public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
setTimeString(hourOfDay, minute, 0); timeView.setText(timeString);
}
} private void showTimePickerDialog() {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getFragmentManager(), "timePicker");
} private static void setTimeString(int hourOfDay, int minute, int mili) {
String hour = "" + hourOfDay;
String min = "" + minute; if (hourOfDay < 10)
hour = "0" + hourOfDay;
if (minute < 10)
min = "0" + minute; timeString = hour + ":" + min + ":00";
}

设定默认日期时间

// Use this method to set the default date and time

    private void setDefaultDateTime() {

        mDate = new Date();
mDate = new Date(mDate.getTime()); Calendar c = Calendar.getInstance();
c.setTime(mDate); setDateString(c.get(Calendar.YEAR), c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH)); dateView.setText(dateString); setTimeString(c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE),
c.get(Calendar.MILLISECOND)); timeView.setText(timeString);
}

使用BaseAdapter实现复杂的ListView(转)原文链接

package com.app.weixin;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import com.app.wexin.R; import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; public class WeixinActivity extends Activity {
private ImageView img;
private List<HashMap<String, Object>> mData;
private ListView listView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.friend_list);
mData = getData();//为刚才的变量赋值
MyAdapter adapter = new MyAdapter(this);//创建一个适配器 listView = (ListView) findViewById(R.id.listView1);//实例化ListView
listView.setAdapter(adapter);//为ListView控件绑定适配器
} /** 自定义适配器 */
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;// 动态布局映射 public MyAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
} // 决定ListView有几行可见
@Override
public int getCount() {
return mData.size();// ListView的条目数
} @Override
public Object getItem(int arg0) {
return null;
} @Override
public long getItemId(int arg0) {
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(R.layout.friend_list_item, null);//根据布局文件实例化view
TextView title = (TextView) convertView.findViewById(R.id.title);//找某个控件
title.setText(mData.get(position).get("title").toString());//给该控件设置数据(数据从集合类中来)
TextView time = (TextView) convertView.findViewById(R.id.time);//找某个控件
time.setText(mData.get(position).get("time").toString());//给该控件设置数据(数据从集合类中来)
TextView info = (TextView) convertView.findViewById(R.id.info);
info.setText(mData.get(position).get("info").toString());
img = (ImageView) convertView.findViewById(R.id.img);
img.setBackgroundResource((Integer) mData.get(position).get("img"));
return convertView;
}
}
// 初始化一个List
private List<HashMap<String, Object>> getData() {
// 新建一个集合类,用于存放多条数据
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = null;
for (int i = 1; i <= 40; i++) {
map = new HashMap<String, Object>();
map.put("title", "人物" + i);
map.put("time", "9月20日");
map.put("info", "我通过了你的好友验证请求");
map.put("img", R.drawable.pic_person);
list.add(map);
} return list;
}
public void showInfo(int position){
getData();
}
}

Lab - Notifications

注册broadcast receiver

public static final String DATA_REFRESHED_ACTION = "course.labs.notificationslab.DATA_REFRESHED";

private BroadcastReceiver mRefreshReceiver;

registerReceiver(mRefreshReceiver, new IntentFilter(DATA_REFRESHED_ACTION));

unregisterReceiver(mRefreshReceiver);
final PendingIntent pendingIntent = PendingIntent.getActivity(mParentActivity, 0, restartMainActivtyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

// Uses R.layout.custom_notification for the
// layout of the notification View. The xml
// file is in res/layout/custom_notification.xml RemoteViews mContentView = new RemoteViews(
mApplicationContext.getPackageName(),
R.layout.custom_notification); // TODO: Set the notification View's text to
// reflect whether or the download completed
// successfully
mContentView.setTextViewText(R.id.text, successMsg); // TODO: Use the Notification.Builder class to
// create the Notification. You will have to set
// several pieces of information. You can use
// android.R.drawable.stat_sys_warning
// for the small icon. You should also setAutoCancel(true). Notification.Builder notificationBuilder = new Notification.Builder(
mParentActivity)
.setSmallIcon(android.R.drawable.stat_sys_warning)
.setAutoCancel(true)
.setContent(mContentView)
.setContentIntent(pendingIntent); // TODO: Send the notification
// Pass the Notification to the NotificationManager:
NotificationManager mNotificationManager = (NotificationManager) mParentActivity.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(MY_NOTIFICATION_ID,
notificationBuilder.build());

Lab - Graphics(Gesture)

mGestureDetector = new GestureDetector(this,

        new GestureDetector.SimpleOnGestureListener() {

            // If a fling gesture starts on a BubbleView then change the
// BubbleView's velocity @Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) { // TODO - Implement onFling actions.
// You can get all Views in mFrame using the
// ViewGroup.getChildCount() method
for(int i=0;i<mFrame.getChildCount();i++){
BubbleView bubbleNew= (BubbleView) mFrame.getChildAt(i);
if (bubbleNew.intersects(event1.getX(),event1.getY())){
bubbleNew.deflect(velocityX, velocityY);
return true;
}
} return false; } // If a single tap intersects a BubbleView, then pop the BubbleView
// Otherwise, create a new BubbleView at the tap's location and add
// it to mFrame. You can get all views from mFrame with ViewGroup.getChildAt() @Override
public boolean onSingleTapConfirmed(MotionEvent event) { // TODO - Implement onSingleTapConfirmed actions.
// You can get all Views in mFrame using the
// ViewGroup.getChildCount() method
for(int i=0;i<mFrame.getChildCount();i++){
BubbleView bubbleNew= (BubbleView) mFrame.getChildAt(i);
if (bubbleNew.intersects(event.getX(),event.getY())){
//sound now
return true;
}
}
BubbleView bubbleView = new BubbleView(getApplicationContext(), event.getX(), event.getY()); mFrame.addView(bubbleView);
bubbleView.start(); return true;
}
});
@Override
public boolean onTouchEvent(MotionEvent event) { // TODO - delegate the touch to the gestureDetector return mGestureDetector.onTouchEvent(event); }

定时任务

// Start moving the BubbleView & updating the display
private void start() { // Creates a WorkerThread
ScheduledExecutorService executor = Executors
.newScheduledThreadPool(1); // Execute the run() in Worker Thread every REFRESH_RATE
// milliseconds
// Save reference to this job in mMoverFuture
mMoverFuture = executor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
// TODO - implement movement logic.
// Each time this method is run the BubbleView should
// move one step. If the BubbleView exits the display,
// stop the BubbleView's Worker Thread.
// Otherwise, request that the BubbleView be redrawn.
if(moveWhileOnScreen()){
stop(false);
}else{
postInvalidate(); }
}
}, 0, REFRESH_RATE, TimeUnit.MILLISECONDS);
}
// Draw the Bubble at its current location
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
// TODO - save the canvas
canvas.save(); // TODO - increase the rotation of the original image by mDRotate
mRotate += mDRotate;
// TODO Rotate the canvas by current rotation
canvas.rotate(mRotate, mXPos + mScaledBitmapWidth/2, mYPos + mScaledBitmapWidth/2); // TODO - draw the bitmap at it's new location
canvas.drawBitmap(mScaledBitmap, mXPos, mYPos, mPainter); // TODO - restore the canvas
canvas.restore();
}

注意canvas中画的图坐标不是在中心,而是左上角

// Sound variables

    // AudioManager
private AudioManager mAudioManager;
// SoundPool
private SoundPool mSoundPool;
// ID for the bubble popping sound
private int mSoundID;
// Audio volume
private float mStreamVolume; // Manage bubble popping sound
// Use AudioManager.STREAM_MUSIC as stream type mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); mStreamVolume = (float) mAudioManager
.getStreamVolume(AudioManager.STREAM_MUSIC)
/ mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // TODO - make a new SoundPool, allowing up to 10 streams
mSoundPool = new SoundPool(, AudioManager.STREAM_MUSIC, ); // TODO - set a SoundPool OnLoadCompletedListener that calls setupGestureDetector()
mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener(){ @Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
if ( == status) {
setupGestureDetector();
}
} }); // TODO - load the sound from res/raw/bubble_pop.wav
mSoundID = mSoundPool.load(this, R.raw.bubble_pop, );
mSoundPool.play(mSoundID, mStreamVolume, mStreamVolume, , , 1.0f);

(updated on Mar 1th)Programming Mobile Applications for Android Handheld Systems by Dr. Adam Porter的更多相关文章

  1. Programming Impala Applications

    Programming Impala Applications The core development language with Impala is SQL. You can also use J ...

  2. PhoneGap与Jquery Mobile组合开发android应用的配置

    PhoneGap与Jquery Mobile结合开发android应用的配置 由于工作需要,用到phonegap与jquery moblie搭配,开发android应用程序. 这些技术自己之前也都没接 ...

  3. 使用jQuery Mobile + PhoneGap 开发Android应用程序(转)

    使用jQuery Mobile + PhoneGap 开发Android应用程序(转) 一.简介 jQuery Mobile是jQuery在手机上和平板设备上的版本.jQuery Mobile 不仅给 ...

  4. PhoneGap与Jquery Mobile结合开发android应用配置

    由于工作需要,用到phonegap与jquery moblie搭配,开发android应用程序. 这些技术自己之前也都没接触过,可以说是压根没听说过,真是感慨,在开发领域,技术日新月异,知识真是永远学 ...

  5. javascript判断设备类型-手机(mobile)、安卓(android)、电脑(pc)、其他(ipad/iPod/Windows)等

    使用device.js检测设备并实现不同设备展示不同网页 html代码: <!doctype html> <html> <head> <meta charse ...

  6. Signing Your Applications(Android签名相关)

    In this document Signing Overview Signing in Debug Mode Signing in Release Mode Signing Android Wear ...

  7. scaleform mobile sdk for android 多点触摸 修正

    修正 scaleform 的多点触控 (随手一记 给后来的人做个参考) scaleform 版本号 4.2.24 (估计这就是最后一个 移动版的版本了,万年没有更新了) 开始 一直以为 scalefo ...

  8. 无责任共享 Coursera、Udacity 等课程视频

    本文转载自网络,原作者不详. (本文是用 markdown 写的,访问 https://www.zybuluo.com/illuz/note/71868 获得更佳体验) 程序语言 interactiv ...

  9. [转]Android 学习资料分享(2015 版)

    转 Android 学习资料分享(2015 版) 原文地址:http://www.jianshu.com/p/874ff12a4c01 目录[-] 我是如何自学Android,资料分享(2015 版) ...

随机推荐

  1. JAVA-json数据与Java的bean类的互相转换

    Java调用webservice时用到了json格式的数据,然后就整理这个类.那里不合适的话,希望能够得到指正. public class JsonsAndBeanList { /** * json数 ...

  2. Android内存使用——垃圾回收LOG,GC_CONCURRENT等的意义的说明

    在调试程序的时候,经常发现GC_CONCURRENT之类的打印.在网上搜了一下,感觉说法各式各样.最后,在Google的官方网站上发现了详细介绍. Every time a garbage colle ...

  3. 单例/单体模式(Singleton)

    单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式. 单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3, ...

  4. 【python接口自动化】httpUtils

    # coding=utf8 import requests from common.logger import Logger import logging class httpUtils: logge ...

  5. jquery中append、prepend, before和after方法的区别(一)

    原文:http://blog.csdn.net/woosido123/article/details/64439490 在 jquery中append() 与 prepend()是在元素内插入内容(该 ...

  6. StarUML 系列,静态图与动态图,用例图,类图【ps:熟悉一下starUML】

    大部分:   静态图部分,即静态不动的图 1.用例图, Use case diagram 1.展示系统核心功能及与其交互的用户ACTOR 表示:椭圆

  7. python 修饰器 最好的讲解

    Python的修饰器的英文名叫Decorator,修饰器就是对一个已有的模块做一些“修饰工作”,比如在现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能 ...

  8. 获取当前网络中的电脑数目及MAC-通过MAC查找IP-通过IP查询机器名

    Microsoft Windows [版本 ] 版权所有 (c) Microsoft Corporation.保留所有权利. C:\Users\Administrator>netsh netsh ...

  9. Day 20 迭代器、生成器

    一. 迭代器 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实 ...

  10. MinGW 使用和创建 DLL 应注意的问题

    MinGW 是 GCC 的 Windows 版本,稳定版已经到了 4.5.2,功能和性能上很好,感觉不比 Microsoft 自家的 VC 差啊.但是 MinGW 下使用和创建 DLL 倒是要特别注意 ...