16 “机器人”的管理员——Activity
2.编写EventActivity.java
public class EventActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
showInfo("按键,按下");
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
showInfo("按键,弹起");
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
showInfo("你单击的坐标为:("+x+":"+y+")");
return super.onTouchEvent(event);
}
public void showInfo(String info){
Toast.makeText(EventActivity.this, info, Toast.LENGTH_LONG).show();
}
}
16.1 Activity生命周期
2.编写MainActivity.java
首先要重写七个相应被触发的方法,以日志的形式输出相应的事件信息。然后添加两个button,一个用来启动新的Activity,另一个是用来退出当前Activity。
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG, "onCreate()");
Button button =(Button) this.findViewById(R.id.button);
Button button1 =(Button) this.findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Other
Activity.class);
startActivity(intent);
}
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onDestroy() {
Log.i(TAG, "onDestroy()");
super.onDestroy();
}
@Override
protected void onPause() {
Log.i(TAG, "onPause()");
super.onPause();
}
@Override
protected void onRestart() {
Log.i(TAG, "onRestart()");
super.onRestart();
}
@Override
protected void onResume() {
Log.i(TAG, "onResume()");
super.onResume();
}
@Override
protected void onStart() {
Log.i(TAG, "onStart()");
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop()");
super.onStop();
}
}
16.2 为应用添加新的Activity
16.2.1 利用Activity实现页面转换
2.编写main.xml
在main.xml中加入一个按钮,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="这是第一页"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一页"
></Button>
</LinearLayout>
3.编写two.xml
然后新建一个Layout文件,two.xml,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="这是第二页"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一页"
></Button>
</LinearLayout>
4.编写OneActivity.java
代码如下:
public class OneActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextLayout();//显示下一个页面
}
});
}
public void nextLayout(){
setContentView(R.layout.two);
Button upButton=(Button)findViewById(R.id.up);
upButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { //显示上一个页面
upLayout();
}
});
}
public void upLayout() {
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nextLayout();//显示下一个页面
}
});
}
}
16.2.2 添加Activity
在other.xml中加入一个TextView,代码如下:
other.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个Activity"
></TextView>
</LinearLayout>
在main.xml中加入一个button,代码如下:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第一个Activity"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/next"
android:text="打开新的Activity"
></Button>
</LinearLayout>
2.编写MainActivity.java
代码如下:
MainActivity.java
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开other activity
//Intent用于激活组件(Activity)和在组件之间传递数据
Intent intent = new Intent(MainActivity.this,
OtherActivity.class);//激活OtherActivity
}
});
}
}
然后在OtherActivity中实现onCreate()方法,加载other.xml,代码如下:
public class OtherActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
}
}
在AndroidManifest.xml文件中注册OtherActivity,代码如下:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sharpandroid.many"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/
app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity"
android:label="@string/app_name">
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
16.2.3 得到新打开的Activity关闭后返回的数据
首先,在other.xml中加入一个关闭按钮,代码如下:
Other.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/other"
android:text="第二个Activity"
></TextView>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/close"
android:text="关闭"
></Button>
</LinearLayout>
在OtherActivity关闭之前,把要返回的数据放入到Intent中,然后调用OtherActivity的setResult()方法,代码如下:
public class OtherActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Intent intent = this.getIntent();//得到激活该组件的意图
Bundle bundle= intent.getExtras();
String name=bundle.getString("name");
int age=bundle.getInt("age");
TextView paramView = (TextView) this.findViewById(R.id.other);
paramView.setText("名称:"+ name + " 年龄:"+ age); //显示数据
Button button=(Button)findViewById(R.id.close);
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent data=new Intent();
data.putExtra("name", "王三");
data.putExtra("age", 23); //要返回的数据
OtherActivity.this.setResult(1, data);//设置返回码和数据,
返回码可以任意
OtherActivity.this.finish();//关闭Activity
}
});
}
}
编写MainActivity.java:
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
OtherActivity.class);//激活OtherActivity
intent.putExtra("name", "hou") ;
intent.putExtra("age", 22) ;
Bundle bundle=new Bundle();
Bundle.putString("name", "侯二");
Bundle.putInt("age", 22);
intent.putExtras(bundle);//附带上额外的数据
startActivityForResult(intent, 1);
//如果需要打开的Activity向前面Activity返回数据,就必须使用此方法
打开Activity
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
//用提示来显示返回的信息
Toast.makeText(MainActivity.this, data.getStringExtra("name")
+data.getIntExtra("age", 1), 3).show();
super.onActivityResult(requestCode, resultCode, data);
}
}
16.2.4 请求码的作用
有关请求码代码如下:
public void onCreate(Bundle savedInstanceState) {
...
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this,
NewActivity.class), 1);
}});
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this,
NewActivity.class), 2);
}});
@Override protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
switch(requestCode){
case 1:
//来自按钮1的请求,进行相应业务处理
case 2:
//来自按钮2的请求,进行相应业务处理
}
}
16.2.5 结果码的作用
为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity打开的新Activity):
public class ResultActivity extends Activity {
...
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
...
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开
ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
}
}
}
17 “机器人”的邮递员——Intent
17.1 Intent简介
17.1.1 不同Activity之间的数据传输
编写MainActivity.java,传递数据的MainActivity的代码如下所示。
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开other activity
//Intent用于激活组件(Activity)和在组件之间传递数据
Intent intent = new Intent(MainActivity.this,
OtherActivity.class);//所要干的一件事情是激活OtherActivity
intent.putExtra("name", "hou") ;
intent.putExtra("age", 22) ;
startActivity(intent);
}
});
}
}
编写OtherActivity.java,OtherActivity接收数据的代码如下。
public class OtherActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Intent intent = this.getIntent();//得到激活该组件的意图
String name = intent.getStringExtra("name");//从意图中获取前面Activity
传递过来的参数
int age = intent.getIntExtra("age", 0);
TextView paramView = (TextView) this.findViewById(R.id.other);
paramView.setText("名称:"+ name + " 年龄:"+ age); //显示数据
}
}
17.1.2 另一种传递数据的方式
编写MainActivity.java,MainActivity用Bundle携带数据的代码如下所示。
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button nextButton=(Button)findViewById(R.id.next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开other activity
//用于激活组件(Activity)和在组件之间传递数据的Intent
Intent intent = new Intent(MainActivity.this,
OtherActivity.class);
//激活OtherActivity
Bundle bundle=new Bundle();
bundle.putString("name", "侯二");
bundle.putInt("age", 22);
//附带上额外的数据
intent.putExtras(bundle);
startActivity(intent);
}
});
编写OtherActivity.java:
public class OtherActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Intent intent = this.getIntent();//得到激活该组件的意图
Bundle bundle= intent.getExtras();//得到Bundle对象
String name=bundle.getString("name");
int age=bundle.getInt("age");
TextView paramView = (TextView) this.findViewById(R.id.other);
paramView.setText("名称:"+ name + " 年龄:"+ age); //显示数据
}
}
17.2 意 图 测 试
1.编写intent.xml
在intent.xml中添加一个TextView控件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/intent"
android:text="通过隐式意图打开的Activity"
></TextView>
</LinearLayout>
2.编写IntentActivity.java
在IntentActivity中加载intent.xml,代码如下:
public class IntentActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intent);
}
}
3.编写AndroidManifest.xml
在AndroidManifest.xml文件中对IntentActivity进行配置,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sharpandroid.many"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label=
"@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity"
android:label="@string/app_name">
</activity>
<activity android:name=".IntentActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="intent.IntentActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
4.编写main.xml
在main.xml中加入一个新的按钮,通过隐式意图打开IntentActivity,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第一个Activity"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/next"
android:text="打开新的Activity"
></Button>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="打开IntentActivity"
android:id="@+id/intentbutton"
/>
</LinearLayout>
5.完成MainActivity.java
在MainActivity中单击按钮,通过隐式意图调用IntentActivity,代码如下:
Button button2 = (Button) this.findViewById(R.id.intentbutton);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("intent.IntentActivity");
startActivity(intent);
}
});
18 “机器人”的隐形管理员——Service
2.编写Service_Player.java
public class Service_Player extends Service {
private static final String TAG = "Service_Player";
MediaPlayer MPlayer;
@Override
public void onCreate() {
Log.i(TAG, "onCreate()");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "onStart()");
MPlayer = MediaPlayer.create(this,R.raw.mayday);
MPlayer.start();
}
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy()");
super.onDestroy();
MPlayer.stop();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
MPlayer = MediaPlayer.create(this,R.raw.mayday);
在AndroidManifest.xml中注册相关Service信息:
<service android:name=".Service_Player">
<intent-filter>
<action android:name="com.sharpandroid.Music"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
在Activity中通过按钮单击事件来启动Service:
bStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过Intent启动已注册的service
startService(new Intent("com.sharpandroid.Music"));
}
});
bStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(new Intent("com.sharpandroid.Music"));
}
});
18.1 bindService()和startService()区别
编写Service_Player.java:
public class Service_Player extends Service {
private MediaPlayer MPlayer;
public static final String MUSIC_COMPLETED = "com.sharpandroid.
Service_Player.completed";
private final IBinder mBinder = new LocalBinder();
//添加监听事件,当音乐播放完毕后,触发广播事件
MediaPlayer.OnCompletionListener CompleteListener = new MediaPlayer.
OnCompletionListener()
{
public void onCompletion(MediaPlayer mp)
{
Intent i = new Intent(MUSIC_COMPLETED);
sendBroadcast(i);
}
};
public class LocalBinder extends Binder
{
public Service_Player getService()
{
return Service_Player.this;
}
}
@Override
public void onCreate() {
MPlayer = MediaPlayer.create(this,R.raw.mayday);
MPlayer.setOnCompletionListener(CompleteListener);
super.onCreate();
}
public void start(){
MPlayer.start();
}
@Override
public void onDestroy() {
super.onDestroy();
MPlayer.stop();
}
public IBinder onBind(Intent intent)
{
return mBinder;
}
}
编写Service_Broadcast.java:
public class Service_Broadcast extends BroadcastReceiver {
public static final String MUSIC_COMPLETED = "com.sharpandroid.
Service_Player.completed";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(MUSIC_COMPLETED)) {
Toast.makeText(context, "播放结束", Toast.LENGTH_LONG).show();
context.stopService(new Intent("com.sharpandroid.Music"));
}
}
}
在Service_Activity.java中添加如下代码:
private Service_Player servicePlayer = null;
private ServiceConnection connection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className,
IBinder service)
{
servicePlayer = ((Service_Player.LocalBinder)service).
getService();
}
public void onServiceDisconnected(ComponentName className)
{
servicePlayer = null;
}
};
并在onCreate()方法中添加如下代码:
bindService(new Intent(this,Service_Player.class), connection, Context.
BIND_AUTO_CREATE);
19 “机器人”的接收员——BroadcastReceiver
19.1 短信听器
编写SMSListenBroadcastReceiver.java:
public class SMSListenBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {//这个方法一旦
返回了,}android会回收BroadcastReceiver
Object[] pdus = (Object[])intent.getExtras().get("pdus");
if(pdus!=null && pdus.length>0){
SmsMessage[] messages = new SmsMessage[pdus.length];
for(int i=0 ; i<pdus.length ; i++){
//得到短信内容,内容是以pdu格式存放的
byte[] pdu = (byte[])pdus[i];
//使用pdu格式的数据创建描述短信的对象
messages[i] = SmsMessage.createFromPdu(pdu);
}
for(SmsMessage msg : messages){
//得到短信内容
String content = msg.getMessageBody();
//得到短信发送者手机号
String sender = msg.getOriginatingAddress();
//得到短信的发送时间
Date date = new Date(msg.getTimestampMillis());
//把收到的短信传递给监控者
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss");
String sendContent = format.format(date)+ ":"+ sender+
"--"+ content;
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("5556", null, sendContent,
null, null);
}
}
}
}