当前位置: 代码迷 >> Android >> android TIPS总结
  详细解决方案

android TIPS总结

热度:66   发布时间:2016-05-01 16:40:38.0
android TIPS小结
1 APP下载自动升级的方法
  当我们的APP升级到新版本时,一般采用的方法就是程序检测服务器上的版本,如果比当

前版本更新,则下载服务器上的版本,然后安装。这里就不讨论下载的过程了,如果不会

请参考之前的文章 Android文件下载进度条的实现,这里只讨论下载完后执行安装的操作


首先,安装程序需要特殊权限。打开AndroidMenifest.xml,在</application>后、

</manifest>之前加上后面的代码: <uses-permission android:name=”

android.permission.INSTALL_PACKAGES” />,这样你的APP就有安装软件权限了。
接下是安装的关键代码,下载完后执行:

     Uri uri = Uri.fromFile(new File("/sdcard/temp.apk")); //这里是APK路径
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(uri,"application/vnd.android.package-archive");
    startActivity(intent);

2实现开机自启动

,我们只需要监听一个开机启动的Broadcast(广播)即可。首先写一个Receiver(即广播

监听器),继承BroadcastReceiver,如下所示:

  public class BootReceiver extends BroadcastReceiver {
private PendingIntent mAlarmSender;
@Override
public void onReceive(Context context, Intent intent) {
// 在这里干你想干的事(启动一个Service,Activity等),本例是启

动一个定时调度程序,每30分钟启动一个Service去更新数据
mAlarmSender = PendingIntent.getService(context, 0, new Intent

(context,
RefreshDataService.class), 0);
long firstTime = SystemClock.elapsedRealtime();
AlarmManager am = (AlarmManager) context
.getSystemService(Activity.ALARM_SERVICE);
am.cancel(mAlarmSender);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,

firstTime,
30 * 60 * 1000, mAlarmSender);
}
}
<RECEIVER android:name=".service.BootReceiver">
    <INTENT-FILTER>
<!-- 系统启动完成后会调用-->
<ACTION android:name="android.intent.action.BOOT_COMPLETED">
</ACTION>
    </INTENT-FILTER>
</RECEIVER>


3 调用系统发短信
   Uri smsToUri = Uri.parse("smsto:10086");
    Intent intent = new Intent(

android.content.Intent.ACTION_SENDTO, smsToUri );
    intent.putExtra("sms_body", "这是内容");
    startActivity( intent );

4 检查SD卡是否可用
    if (Environment.getExternalStorageState().equals

(Environment.MEDIA_MOUNTED)) {  
        setTitle("SD可用");
            }else {  
            setTitle("SD不可用");
            }

5 读取手机序列号IMEI,SIM序列号IMSI方法
  IMEI是国际移动设备身份码的缩写,每台手机都有一个唯一的IMEI号码(貌似有国产山

寨机用同一个IMEI)。IMSI是国际移动用户识别码缩写,每张SIM卡都有唯一的一个IMSI号

码。因为他们都是唯一的,有些时候我们可以用他们来识别用户身份,不用再输帐号登录

(这样一来,没有IMEI和IMSI的android MP4,平板电脑就用不了了),以下是读取方法:

        TelephonyManager tm = (TelephonyManager) this.getSystemService

(Context.TELEPHONY_SERVICE);
        String imei = tm.getDeviceId(); 
        String imsi =tm.getSubscriberId();

6 禁止切换横竖屏

Android系统在开启自动切换横竖屏的情况下,转动手机就会自动切换横竖屏,或者在推开

键盘时也会自动切换到横屏。但是有时我们的程序只针对竖屏做了优化,在横屏时显示就

会乱,影响用户体验,所以我们必须禁止系统自动切换。要达到这个目标,其实很简单。


在AndroidManifest.xml中,所有的Activity标签都加上android:screenOrientation属性

,横屏值为landscape,竖屏值为portrait。这样基本实现了锁定横屏或竖屏,但是在一些

有侧滑键盘的手机上(比如说我的Milestone),推开键盘的时候,Activity会自动重启,

要避免在这种情况下重启Activity,可以在androidmanifest.xml文件中的每个activity加

上android:configChanges=”keyboardHidden|orientation”属性,然后重写

onConfigurationChanged方法

Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}

不过,这样载入的只是main.xml默认设置,如果在程序代码中修改过布局(改过TextView

的Text之类),是不会显示修改后的结果的。

7 在应用程序级别使用变量
   Android应用程序开发中,有的时候我们在应用程序的任何一个地方都需要访问一个全

局变量,也就是在任何一个Activity中都可以访问的变量。它不会因为Activity的生命周

期结束而消失。要实现应用程序级的变量,我们可以通过Application这个类来实现。 首

先,我们新建一个类HelloApplication继承Android.app.Application类,然后在我们的类

中增加一些变量。如下所示:

public class HelloApplication extends Application {
        private int globalVariable=1;

        public int getGlobalVariable() {
                return globalVariable;
        }

        public void setGlobalVariable(int globalVariable) {
                this.globalVariable = globalVariable;
        }
}
完成之后,我们在应用程序的任何一个Activity中可以通过如下方法访问我们的变量:

((HelloApplication)getApplication()).setGlobalVariable(10);
int valiable=((HelloApplication)getApplication()).getGlobalVariable();
public class DataStoreClass {
        private static int globalVariable=1;

        public static int getGlobalVariable() {
                return globalVariable;
        }

        public static void setGlobalVariable(int newGlobalVariable) {
                globalVariable = newGlobalVariable;
        }
}

8
ANDROID的style:
  <?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>
应用
  <TextView
    style="@style/CodeFont"
    android:text="@string/hello" />


9 android标题栏(titlebar)显示进度条
  在后台线程中执行各种操作(网络连接、大数据存储)的时候,我们希望让客户能看到

后台有操作在进行,那么既能有效的提示用户,又不占用当前操作空间,最好的方法就是

在标题栏有个进度条。

  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//

先给Activity注册界面进度条功能
setContentView(R.layout.main);
setProgressBarIndeterminateVisibility(true);//在需要显示进度条

的时候调用这个方法
setProgressBarIndeterminateVisibility(false);//在不需要显示进度

条的时候调用这个方法
}

10 自定义一个控件,比如可以修改一个textview,步骤如下:
   1 首先继承edittext类
    public class NeverEdit extends EditText {
   
    /*构造方法-1*/
    public NeverEdit(Context context) {
        super(context);
    }
   
    /*构造方法-2:用XML布局需要此构造方法*/
    public NeverEdit(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /*重新实现对按键安下事件处理*/
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       
        /*什么都不做*/
       
        /*
         * 返回真表示已经处理此事件
         */
        return false;
    }

  2 在布局文件中
  <com.NeverEdit
    android:id="@+id/neveredit" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />
    <LinearLayout
    android:layout_width="fill_parent"
   android:layout_height="wrap_content">
    <Button
    android:id="@+id/append"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="添加" />
    <Button
    android:id="@+id/clear"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="清除" />

  3 主文件中
       public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ch4ex13);
        /*获得实例变量以操作*/
        appendBtn = (Button)findViewById(R.id.append);
        clearBtn = (Button)findViewById(R.id.clear);
        toBeEdited = (NeverEdit)findViewById(R.id.neveredit);
        /*实现单击事件监听接口*/
        btnClick = new OnClickListener() {
         
            public void onClick(View v) {
                if (v == appendBtn) {
                    /*若触发的View是添加按钮时,给NeverEdit添加字符串*/
                    toBeEdited.append("Android");
                } else if (v == clearBtn) {
                    /*若触发的View是清除按钮时,清空NeverEdit*/
                    toBeEdited.getText().clear();
                } else {
                    /*若触发的View是其他的话什么也不做*/
                }
            }
           
        };
        /*设置单击事件监听接口*/
        appendBtn.setOnClickListener(btnClick);
        clearBtn.setOnClickListener(btnClick);

  结果就是编辑框不能被编辑了

  相关解决方案