activity生命周期
完整生命周期 oncreate--》onstart--》onresume--》onpause--》onstop--》ondestory
可视生命周期 onstart--》onresume--》onpause--》onstop
前台生命周期 onresume--》onpause 界面用户仍然可见,但是失去焦点
使用场景:
1.应用程序退出自动保存数据 ondestory oncreate
2.应用程序最小化 暂停的操作 onstop onstart 视频播放器
3.游戏的暂停和开始 前台生命周期
package com.itheima.lifecycle; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { //被创建的时候调用的方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("oncreate"); } //被销毁的时候调用的方法 @Override protected void onDestroy() { System.out.println("ondestory"); super.onDestroy(); } //当activity界面用户可见的时候调用的方法 @Override protected void onStart() { System.out.println("onstart"); super.onStart(); } @Override protected void onRestart() { System.out.println("onrestart"); super.onRestart(); } //当activity界面用户不可见的时候调用的方法 @Override protected void onStop() { System.out.println("onstop"); super.onStop(); } //界面开始获取到焦点对应的方法。 (界面按钮可以被点击,文本框可以输入内容) @Override protected void onResume() { System.out.println("onresume"); super.onResume(); } //界面失去焦点对应的方法(暂停)(按钮不可被点击,文本框不可输入内容,但是界面用户仍然能看见) @Override protected void onPause() { System.out.println("onpause"); super.onPause(); } public void click(View view){ Intent intent = new Intent(this,SecondActivity.class); startActivity(intent); } }
横竖屏切换的生命周期
默认情况下横竖屏切换activity会被销毁然后重新创建。
package com.itheima.kof97; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; /** * 默认情况下横竖屏切换activity会被销毁然后重新创建。 * @author Administrator * */ public class MainActivity extends Activity { private TextView tv_blood; private int blood = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("oncreate"); setContentView(R.layout.activity_main); tv_blood = (TextView) findViewById(R.id.tv_blood); } public void click(View view){ blood --; tv_blood.setText("对方的生命值:"+blood);
package com.itheima.ipdail; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; /** * 1.创建一个收音机 继承广播接受者 * */ public class OutCallReceiver extends BroadcastReceiver { //当接收到消息对应的方法 @Override public void onReceive(Context context, Intent intent) { String number = getResultData(); System.out.println("哈哈,有电话打出去了"+number); SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE); String ipnumber = sp.getString("ipnumber", ""); //判断是否是长途。是否有前缀 setResultData(ipnumber+number); } } package com.itheima.ipdail; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_number; private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_number = (EditText) findViewById(R.id.et_number); sp = getSharedPreferences("config", MODE_PRIVATE); } public void save(View view){ String ipnumber = et_number.getText().toString().trim(); if(TextUtils.isEmpty(ipnumber)){ Toast.makeText(this, "清除ip号码成功", 0).show(); }else{ Toast.makeText(this, "设置ip号码成功", 0).show(); } Editor editor = sp.edit(); editor.putString("ipnumber", ipnumber); editor.commit(); } }
sd卡的广播事件
package com.itheima.sdcardmointor; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class SDStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "sd卡别移除,微信头像或者图片暂时不可用", 1).show(); } }
短信广播接受者
package com.itheima.smsreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; /** * 1.创建一个收音机 继承广播接受者 * */ public class OutCallReceiver extends BroadcastReceiver { //当接收到消息对应的方法 @Override public void onReceive(Context context, Intent intent) { String number = getResultData(); if("5556".equals(number)){ setResultData(null); } } } package com.itheima.smsreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsMessage; public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("短信到来了。 。。。"); Object[] objs = (Object[]) intent.getExtras().get("pdus"); for (Object obj : objs) { // 得到短信对象 SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj); String body = smsMessage.getMessageBody(); String sender = smsMessage.getOriginatingAddress(); System.out.println("body:" + body); System.out.println("sender:" + sender); // 终止掉当前的广播。 if ("5556".equals(sender)) { abortBroadcast(); } } } }
自定义广播的发送和接受
发送广播的电台
package com.itheima.sender; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 发送广播事件 (消息) * @param view */ public void click(View view){ Intent intent = new Intent(); //自定义一个广播动作。 intent.setAction("com.itheima.sender.jiuminga"); //大吼一声 把消息发出去了。 无序广播 sendBroadcast(intent); //发送有序广播 //sendOrderedBroadcast(intent, receiverPermission); } }
package com.itheima.police; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class PoliceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "我是警察,我收到了消息", 1).show(); } }
广播接受者的优先级
package com.itheima.broadcasttest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 发送无序广播 * @param view */ public void send1(View view){ Intent intent = new Intent(); intent.setAction("com.itheima.broadcasttest.songwennuan"); intent.putExtra("msg", "发1万块"); //无序广播,不可被拦截,不可终止。 sendBroadcast(intent); } /** * 发送有序广播 * @param view */ public void send2(View view){ Intent intent = new Intent(); intent.setAction("com.itheima.broadcasttest.songwennuan"); //有序广播,可被拦截,可终止,可以修改数据。 sendOrderedBroadcast(intent, null, new FinalReceiver(), null, 0, "给农民兄弟发10000块钱", null); } } package com.itheima.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class Level1Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message = getResultData(); System.out.println("省级部门得到中央的消息:"+message); abortBroadcast(); setResultData("给农民兄弟发5000块钱"); } } package com.itheima.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class Level2Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message = getResultData(); System.out.println("市级部门得到省级的消息:"+message); setResultData("给农民兄弟发2000块钱"); } } package com.itheima.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class Level3Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message = getResultData(); System.out.println("乡级部门得到市的消息:"+message); setResultData("给农民兄弟发两大大米"); } } package com.itheima.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class FinalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message = getResultData(); System.out.println("农民兄弟得到乡的消息:"+message); } }
进程的优先级&为什么使用服务
服务: 长期后台运行的没有界面的组件
android应用:什么地方需要用到服务?
天气预报:后台的连接服务器的逻辑,每隔一段时间 获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间 获取最新的股票信息
mp3播放器: 后台长期的播放音乐。
new Thread(){}.start();
子线程没有界面,也是长期后台运行的。
android系统进程管理是按照一定的规则的:
1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方面下一次快速启动。
带来内存不足的问题。
2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。
进程分为5个等级的优先级:(从高到低)
1.Foreground process 前台进程 用户正在玩的应用程序对应的进程
2.Visible process 可视进程 用户仍然可以看到这个进程的界面。
3.Service process服务进程 应用程序有一个服务组件在后台运行。
4.Background process 后台进程 应用程序没有服务在运行 并且最小化 (activity onstop)
5.Empty process 空进程 没有任何运行的activity, 任务栈空了
长期后台运行的组件, 不要在activity开启子线程。
应该是创建服务,在服务里面开启子线程。
服务的目的:
1.长期后台运行。
2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。
package com.itheima.testservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } //oncreate ondestory onstart onstop onresume onpause //服务没有界面 @Override public void onCreate() { System.out.println("服务创建了"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("服务接收到了开启指令"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub System.out.println("服务销毁了"); super.onDestroy(); } } package com.itheima.testservice; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View view){ Intent intent = new Intent(this,MyService.class); startService(intent); } }