GVKun编程网logo

Ubuntu 18.10 安装swift 注意事项(ubuntu安装ss)

2

在本文中,您将会了解到关于Ubuntu18.10安装swift注意事项的新资讯,同时我们还将为您解释ubuntu安装ss的相关在本文中,我们将带你探索Ubuntu18.10安装swift注意事项的奥秘

在本文中,您将会了解到关于Ubuntu 18.10 安装swift 注意事项的新资讯,同时我们还将为您解释ubuntu安装ss的相关在本文中,我们将带你探索Ubuntu 18.10 安装swift 注意事项的奥秘,分析ubuntu安装ss的特点,并给出一些关于@Transactional spring 配置事务 注意事项、Android 注意事项 知识点、AndroidManifest.xml 注意事项、apache2 mod_proxy 注意事项的实用技巧。

本文目录一览:

Ubuntu 18.10 安装swift 注意事项(ubuntu安装ss)

Ubuntu 18.10 安装swift 注意事项(ubuntu安装ss)

Ubuntu 18.10 缺少 libtinfo5 相关解决方案

/bin/lldb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
/bin/lldb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
apt-get install libtinfo5
apt install python-dev
apt-get install libncurses5

@Transactional spring 配置事务 注意事项

@Transactional spring 配置事务 注意事项

@Transactional spring 配置事务 注意事项

 

 

近日来,发现有很多童鞋询问:“Mybatis整合Spring3,事务注解为何不起作用? ”,“已经声明了事务,但是无法回滚。。。”“Mybatis如果配置事务,Spring配置没起作用啊!”等等,实际上,无论怎么问或者怎么贴出代码,实际上没有人能够帮你解决这个问题的,首先Spring事务处理方式目前有五种,你用的到底是哪一种呢?回答问题的大神们不清楚,因此他们的回答和招在你那里不会起作用,因此,无论是哪一种事务处理方式首先你要弄明白你用的是哪一种,如果是杂交方式,建议选择事务处理的第四种方式:使用tx标签配置的拦截器,这个简单而且容易上手,如果用这种方式还有问题,那请往下看,有很大可能性是由于这些原因造成的,我们在罗列代码的时候一定要知其然还要知其所以然,这样你不仅能够快速的解决自己的问题,还能够把该问题解决办法与他人共享!

 

 

1. 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上 。

2. @Transactional 注解只能应用到 public 可见度的方法上 。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

3. 注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。

4. 通过 元素的 "proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创 建。 如果 "proxy-target-class" 属值被设置为 "true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为 "false" 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。

Xml代码  

  1. <!-- JTA事务(非分布式事务), 事务配置的时候 ,不能指定dataSource属性(分布式事务,是有全局事务来管理数据库链接的)-->   

  2. <!-- 标准的JDK基于接口的代理将起作用 -->  

  3. <!-- aop切面 -->  

  4.     <aop:aspectj-autoproxy proxy-target-class="false" />  

  5.   

  6. <!-- 基于类的代理将起作用 ,同时 cglib.jar必须在CLASSPATH中 -->  

  7. <!-- aop切面 -->  

  8.     <aop:aspectj-autoproxy proxy-target-class="true" />  

  解@Transactional cglib与java动态代理最大区别是代理目标对象不用实现接口, 那么注解要是写到接口方法上,要是使用cglib代理,这是注解事物就失效了,为了保持兼容注解最好都写到实现类方法上。

5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上 。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。

6. @Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的 。

Java代码  

  1. public interface PersonageTempService {  

  2.     //删除指定id的Personage  

  3.     public void del(Integer Personageid) ;  

  4.   

  5.     //删除指定id的Personage,flag  

  6.     public void del(Integer Personageid,boolean flag) ;  

  7.     }  

  8.   

  9.     public class PersonageTempServiceBean implements PersonageTempService {  

  10.         private JdbcTemplate jdbcTemplate;  

  11.   

  12.         public void del(Integer Personageid){  

  13.             try{  

  14.                 this.del(Personageid,true)  

  15.                 System.out.println("del success");  

  16.             }catch(Exception e){  

  17.                 System.out.println("del failed");  

  18.             }  

  19.         }  

  20.   

  21.         @Transactional  

  22.         //此时,事务根本就没有开启, 即数据库会默认提交该操作,即记录别删除掉  

  23.         public void del(Integer Personageid,boolean flag){  

  24.             if(flag == ture){  

  25.                 jdbcTemplate.update("del from Personage where id=?"new Object[]{Personageid}, new int[]{java.sql.Types.INTEGER});  

  26.                 throw new RuntimeException("运行期例外");  

  27.             }  

  28.         }  

  29.     }  

  30.   

  31.     public class PersonageTempServiceBeanTest{  

  32.         PersonageTempService ps = new PersonageTempServiceBean ();  

  33.         ps.del(5);  

  34.     }  

  35. }  

 7. Spring使用声明式事务处理,默认情况下, 如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback ;如果发生的异常是checked异常,默认情况下数 据库操作还是会提 交的。

Java代码  

  1. public interface PersonageService {  

  2.     //删除指定id的Personage  

  3.     public void del(Integer Personageid) ;  

  4.   

  5.     //获取Personage  

  6.     public Personage getPersonage(Integer Personageid);  

  7.     }  

  8.   

  9.     //PersonageServiceBean 实现了PersonageService 接口,则基于接口的还是基于类的代理 都可以实现事务  

  10.     @Transactional public class PersonageServiceBean implements PersonageService {  

  11.     private JdbcTemplate jdbcTemplate;  

  12.   

  13.     //发生了unchecked异常,事务回滚, @Transactional  

  14.     public void del(Integer Personageid){  

  15.         jdbcTemplate.update("del from Personage where id=?"new Object[]{Personageid},  

  16.         new int[]{java.sql.Types.INTEGER});  

  17.         throw new RuntimeException("运行期例外");  

  18.     }  

  19. }  

 

Java代码  

  1. public interface PersonageService {  

  2.     //删除指定id的Personage  

  3.     public void delete(Integer Personageid) throws Exception;  

  4.   

  5.     //获取Personage  

  6.     public Personage getPersonage(Integer Personageid);  

  7.     }  

  8.   

  9.     @Transactional  

  10.     public class PersonageServiceBean implements PersonageService {  

  11.   

  12.     //发生了checked异常,事务不回滚,即数据库记录仍能被删除,  

  13.     //checked的例外,需要我们在外部用try/catch语法对调用该方法的地方进行包含 @Transactional  

  14.     public void delete(Integer Personageid) throws Exception{  

  15.         jdbcTemplate.update("delete from Personage where id=?"new Object[]{Personageid},  

  16.         new int[]{java.sql.Types.INTEGER});  

  17.         throw new Exception("运行期例外");  

  18.     }  

  19. }  

 但是,对于checked这种例外,默认情况下它是不会进行事务回滚的,但是 如果我们需要它进行事务回滚,这时候可以在delete方法上通过@Transaction这个注解来修改它的行为。

Java代码  

  1. @Transactional  

  2. public class PersonServiceBean implements PersonService {  

  3.   

  4.     @Transactional(rollbackFor=Exception.class)  

  5.     //rollbackFor这属性指定了,既使你出现了checked这种例外,那么它也会对事务进行回滚  

  6.     public void delete(Integer personid) throws Exception{  

  7.         jdbcTemplate.update("delete from person where id=?"new Object[]{personid},  

  8.         new int[]{java.sql.Types.INTEGER});  

  9.         throw new Exception("运行期例外");  

  10.     }  

  11. }  

 

在PersonServiceBean这个业务bean里面,有一些事务是不需要事务管理的,好比说获取数据的getPersons方法,getPerson方法。因为@Transactional 放在了类的上面。


此时,可 以采用propagation这个事务属性 @Transactional(propagation=Propagation.NOT_SUPPORTED),propagation这个属性指定了 事务传播行为,我们可以指定它不支持事务,当我们这么写了之后,Spring容器在getPersons方法执行前就不会开启事务 .

Java代码  

  1. @Transactional  

  2. public class PersonServiceBean implements PersonService {  

  3.     @Transactional(propagation=Propagation.NOT_SUPPORTED)  

  4.     //则此方法 就不会开启事务了  

  5.     public Person getPerson(Integer personid)  

  6.     {  

  7.     }  

  8. }  

 

 

 


Android 注意事项 知识点

Android 注意事项 知识点

1、判断 sd 卡是否存在
 
 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
 
2、TextView 部分文字设置颜色
 
 TextView tv = new TextView(this);
 // 添加 css 样式
 tv.setText (Html.fromHtml ("<font color="#ff0000"> 红色 </font > 其它颜色"));
 
3、替换数据库某字段中某些字符的方法:
 
 update table set spell=replace(spell,''ɡ'',''g'')
 
4、单选按钮默认选中:
 
 mRadioGroup.check(mRadioButton_1.getId());
 
下拉列表默认选中:
 
 for(int j = 0;j < cities.length;j ++){
     if (months [j].equals ("武汉")){
         mSpinner_m.setSelection(j);
     }
 }
 
5、TextView 中嵌套图片:
 
 Drawable draw = getResources().getDrawable(R.drawable.ji_dot_nor);
 textView.setCompoundDrawablesWithIntrinsicBounds(null, draw, null, null);  
 
6、ListView 去掉下拉条:
 
方法一:在 xml 属性中设置
 
 android:scrollbars="none"
 方法二:在代码中设置:
 
 listView.setVerticalScrollBarEnabled(false);
 
7、设置 Activity 的风格:
 
 // 将 Activity 设置成半透明的效果
 android:theme="@android:style/Theme.Translucent"  
 // 将 Activity 设置成对话框的样式  
 android:theme="@android:style/Theme.Dialog"  <span>  <wbr>  <wbr> </wbr></wbr></span>
 
8、创建一个背景模糊的 Widow,且将对话框放在前景
 
 Window window = dialog.getWindow();
 window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);  
 
9、list 滚动时出现黑色底的问题:
 
解决方法:
 方法一:
 在 XML 中设置 android:cacheColorHint="#00000000"
 
方法二:
 在代码中设置 listView.setCacheColorHint (0);
 
10、编辑框中指定输入的类型,设置属性 digits 即可:
 
例:只允许输入数字
 android:digits="0123456789"  或  android:digits="integer"   或  android:digits="num"
 
11、利用反射机制,获取 drawable 文件夹下的图片名称:
 
 Field[] fields = R.drawable.class.getDeclaredFields();
 for(Field field:fields){
     if(!"icon".equals(field.getName())){
         sb.append(field.getName() + "\t");
     }
 }
 mTextView.setText(sb.toString());
 
12、缓冲流播放 MP3:
 
 MediaPlayer player = new MediaPlayer();
 try {
     player.setDataSource(WebMusic.this, Uri.parse("http://stream15.a8.com/a8space/2010/12/30/2010123002225125942.mp3"));
     player.prepare();
     player.start();
 } catch (IllegalArgumentException e) {
     e.printStackTrace();
 } catch (SecurityException e) {
     e.printStackTrace();
 } catch (IllegalStateException e) {
     e.printStackTrace();
 } catch (IOException e) {
     e.printStackTrace();
 }
 
13、下面的代码可以用来点亮屏幕:
 
 PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
 mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.SCREEN_DIM_WAKE_LOCK, "SimpleTimer");
 mWakelock.acquire();
 ...............
 mWakelock.release();
 
下面的代码用来屏幕解锁:
 
 KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
 KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("");
 BkeyguardLock.disableKeyguard();
 
使用这两段代码,需要在 AndroidManifest 文件中加入以下权限:
 
 <uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>
 <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
 
14、android 跑马灯效果做如下设置即可:
 
 android:scrollHorizontally="true"    
 android:marqueeRepeatLimit="marquee_forever"    
 android:ellipsize="marquee"    
 android:focusable="true"    
 android:focusableInTouchMode="true"    
 android:singleLine="true"
 
15、拦截短信:
     当 android 系统接收到短信时,会发送一个广播 BroadcastReceiver,这个广播是以有序广播的形式发送的。
     所谓的有序广播就是广播发出后,接收者是按照设置的优先级一个一个接着接收,前面的接收者可以选择是否终止这条广播以使后面的接收者接收不到,而普遍广播发送 后所有的接收者都能同时接到,但是不能终止这条广播,也不能将它的处理结果传递给下个接收者。
     sms 拦截就是通过实现一个 BroadcastReceiver 并将其的优先级设置的比系统 sms 接收者高。
     android:priority 就是设置优先级的,设置为 100 即可:
 
  <receiver android:name="InterceptSMS">
     <intent-filter android:priority="100">
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
     </intent-filter>
 </receiver>
 
16、如果在文件夹下选择视频文件时,想调用自己的播放器,需要在 Manifest.xml 中设置过滤器,设置如下:
 
  <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT"/>
     <data android:mimeType="video/*"/>
 </intent-filter>
 
如果想在浏览器中调用自己的播放器,设置如下:
 
 <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT"/>
     <category android:name="android.intent.category.BROWSABLE" />
     <data android:mimeType="video/*" android:scheme="http"/>
 </intent-filter>
 
 
 
如果两者都要实现的话,就必须配两个过滤器。
 
17、显示图片时,用 mImageView.setScaleType (ImageView.ScaleType.FIT_XY); 可以填充整个区域。
 
18、保持屏幕长开:
 
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
开启、关闭屏幕时发送的广播:
 
 <receiver android:name=".MyBroadcastReceiver" android:enabled="true">                 
     <intent-filter>                       
         <action android:name="android.intent.action.ACTION_SCREEN_ON"></action>                           
         <action android:name="android.intent.action.ACTION_SCREEN_OFF"></action>                 
     </intent-filter>          
 </receiver>
 
19、判断一个 intent 是否可用:
 
 public static boolean isIntentAvailable(Context context, String action) {
     final PackageManager packageManager = context.getPackageManager();
     final Intent intent = new Intent(action);
     List<ResolveInfo> list = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
     return list.size() > 0;
 }  
 
 上述代码判断 action 的 intent 是否可用
 (备注,也可以得到相应 intent 的应用程序信息)
 
 我们可以根据 scanAvailable 来判断是否让用户操作来发送该 intent:
 
 boolean bool = isIntentAvailable(gallery.this,ACTION);
 if(bool){
     Intent intent = new Intent(ACTION);
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(intent);
 }
 
20、获取所有桌面应用的图标:
 
 private List<Drawable> getImage(){
     PackageManager packageManager = this.getPackageManager();
     Intent intent = new Intent(Intent.ACTION_MAIN);
     intent.addCategory(Intent.CATEGORY_LAUNCHER);
     List<ResolveInfo> infos = packageManager.queryIntentActivities(intent, 0);
     for(ResolveInfo info : infos){
         ActivityInfo ai = info.activityInfo;
         Drawable icon = ai.loadIcon(packageManager);
         list.add(icon);
     }
     return list;
 }
 
21、Android 系统图片数据库:
 
 Uri STORAGE_URI = Images.Media.EXTERNAL_CONTENT_URI;
 
往改数据库中插入数据,用到了内容提供者,大致如下:
 view plaincopy
 ContentValues values = new ContentValues(11);
 values.put(Images.Media.TITLE, title);
 values.put(Images.Media.DISPLAY_NAME, filename);
 values.put(Images.Media.DATE_TAKEN, dateTaken);
 values.put(Images.Media.DATE_MODIFIED, dateTaken);
 values.put(Images.Media.DATE_ADDED, dateAdded);
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put(Images.Media.ORIENTATION, degree[0]);
 values.put(Images.Media.DATA, filePath);
 values.put(Images.Media.SIZE, size);
 values.put(Images.Media.LATITUDE, latitude.floatValue());
 values.put(Images.Media.LONGITUDE, longitude.floatValue());
 
 ContentResolver contentResolver = getContentResolver();
 contentResolver.insert(STORAGE_URI, values);
 
 // 插入数据后刷新一下:
 getContentResolver().notifyChange(STORAGE_URI, null);
 
22、获取 UI 控件的宽、高:
 
在前面几个周期函数中都无法获取宽度和高度值,但在事件中或用定时器可以获取,如下:
 
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
         
     text = (TextView) findViewById(R.id.text);
     btn = (Button) findViewById(R.id.btn);       
     btn.setOnClickListener(new Button.OnClickListener(){
         @Override
         public void onClick(View v) {
             int width = text.getWidth();
             int height = text.getHeight();
             Log.i("Log: ", "----------->"+width + " | " + height);
         }
     });
 }
 
23、判断某一服务是否在运行:
 
 //serviceName:即包名 + 服务的名称
 //return:某一服务正在运行,返回 true,否则返回 false
 public  boolean isRunning(Context c,String serviceName){
     ActivityManager myAM=(ActivityManager)c.getSystemService(Context.ACTIVITY_SERVICE); 
     ArrayList<RunningServiceInfo> runningServices = (ArrayList<RunningServiceInfo>)myAM.getRunningServices(40);
     // 获取最多 40 个当前正在运行的服务,放进 ArrList 里
     for (int i = 0 ; i<runningServices.size ();i++){  // 循环枚举对比
         if(runningServices.get(i).service.getClassName().toString().equals(serviceName)){
             return true;
         }
     }
     return false;
 }
 
 
24、根据角度求正弦值:
 
  Math.sin(Math.PI/2)
 
   根据正弦值求角度:
   Math.toDegrees(Math.asin(1.0))
 
   其他求法同上
 
25、画图时,设置画布抗锯齿:
 
 canvas.setDrawFilter(new PaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
 
26、让 ListView 的滚动条定位到最后一行
 设置以下两个属性:
 
 android:stackFromBottom="true"
 android:transcriptMode="alwaysScroll"
 
27、获取系统所有包的信息:
 
 List<PackageInfo> pkgs = AndroidDemo.this.getPackageManager().getInstalledPackages(0);
 for (int i=0; i<pkgs.size(); i++) {
     PackageInfo info = new PackageInfo();
     info = pkgs.get(i);
     label = info.applicationInfo.loadLabel(getPackageManager()).toString();
     mPackageInfoList.add(label);
     System.out.println("label----------->" + label);
 }
 
 
28、如何判断一个应用是系统应用???
 
 private boolean isDefaultApplication(String packageName) {   
     boolean flag = false;   
     boolean isDefault = false;   
     PackageManager pckMan = mLauncher.getPackageManager();   
     List<PackageInfo> packs = pckMan.getInstalledPackages(0);   
     int count = packs.size();   
     for (int i = 0; i < count && !flag; i++) {   
         PackageInfo p = packs.get(i);   
         ApplicationInfo appInfo = p.applicationInfo;   
         if (packageName.equals(appInfo.packageName)) {   
             if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {   
                 isDefault = true;   
             }   
             flag = true;   
         }   
     }   
     return isDefault;   
 }  
 
核心判断:
 
 if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0){   
     // 系统应用   
 }else{   
     // 用户安装的   
 } 
 
29、卸载应用:
 
 // 包名:package + 具体包路径
 Uri packageURI = Uri.parse("package:com.android.myapp");   
 Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
 startActivity(uninstallIntent);
 
30、检查网络状态:
 
 //return  true 表示有网络可用,dalse 表示无网络可用
 public static boolean checkNetwork(){
     // 检查网络连接,如果无网络可用,就不需要进行连网操作等    
     final NetworkInfo info = mConnectivity.getActiveNetworkInfo();   
     if (info == null) {      
         return false;     
     }    
     // 判断网络连接类型,是 WIFI 网络还是 3G 网络     
     final int netType = info.getType();   
     if (netType == ConnectivityManager.TYPE_WIFI) {   
         return info.isConnected();     
     } else if (netType == ConnectivityManager.TYPE_MOBILE && !mTelephony.isNetworkRoaming()) {
         return info.isConnected();     
     } else {        
         return false;     
     } 
 }
 
31、获取本地 apk 文件的包名:
 
 public void getApkInfo(){
     String apkPath ="/sdcard/JXT_calendar.apk";
     PackageManager pm = GetApkInfo.this.getPackageManager();
     PackageInfo info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);
     if (info != null) {
         ApplicationInfo appInfo = info.applicationInfo;
         Drawable icon = pm.getApplicationIcon(appInfo);
         image.setImageDrawable(icon);
         packageName = appInfo.packageName;
         text.setText("package: " + packageName);
     }
 }
 
32、捕获 Home 键,重写 onAttachedToWindow () 方法,在方法里面 setType 即可,去掉之后就无法捕获 Home 键:
 
 @Override
 public void onAttachedToWindow() {
     // TODO Auto-generated method stub
     this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
     super.onAttachedToWindow();
 }
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
     // TODO Auto-generated method stub
     if(keyCode == KeyEvent.KEYCODE_HOME) {
         // 不做任何操作
     }
     return false;
 }
 
33、Notification 通知如何点击后自动消失:
     代码中加上 notification.flags |= Notification.FLAG_AUTO_CANCEL 即可
     Notification 通知无清楚按钮,如音乐播放时的状态:
     代码中加上 notification.flags |= Notification.FLAG_NO_CLEAR 即可
 
34、横竖屏切换时候 activity 的生命周期 android:configChanges
 
不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
 设置 Activity 的 android:configChanges="orientation" 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
 设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法
 
35、获取默认的应用图标:
 
 private PackageManager mPackageManager;
 mPackageManager = getPackageManager();
 Drawable d = mPackageManager.getDefaultActivityIcon();
 Bitmap b = Bitmap.createBitmap(Math.max(d.getIntrinsicWidth(), 1),Math.max(d.getIntrinsicHeight(), 1),Bitmap.Config.ARGB_8888);
 
36、优化 Dalvik 虚拟机的堆内存分配:
 
    对于 Android 平台来说,其托管层使用的 Dalvik Java VM 从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉 GC 处理,
 使用 dalvik.system.VMRuntime 类提供的 setTargetHeapUtilization 方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: 
 view plaincopy
 private final static float TARGET_HEAP_UTILIZATION = 0.75f; 
 
在程序 onCreate 时调用一下代码即可:
 
 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 
 
Android 堆内存也可自己定义大小:
  
 
 private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;  
     (可参考 Lanucher 源码中 LauncherApplication.java 文件中使用)
  
 
 // 设置最小 heap 内存为 6MB 大小。当然对于内存吃紧来说还可以通过手动干涉 GC 去处理
 VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); 
 // 查看剩余的内存容量。
 Runtime.getRuntime().freeMemory();
 
37、PopupWindow 的使用:
 显示 PopupWindow 的代码如下:
 
 public void showPopupWindow(){
     // 获取上下文环境
     Context context = PopupWindowCalendar.this;
     // 获取系统服务
     LayoutInflater fliter = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
     // 加载自定义的布局文件 date_layout.xml
     View calendarWindow = fliter.inflate(R.layout.date_popup, null);
     //new 一个 PopupWindow ,参数一:将加载的布局放在 PopupWindow 中显示;参数二:设置宽度;参数三:设置高度;参数四:获取焦点
     final PopupWindow popupWindow = new PopupWindow(calendarWindow, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, true);
     // 设置背景 (此处设置是当点击 PopupWindow 之外的区域或按 back 键时隐藏该 PopupWindow)
     ColorDrawable dw = new ColorDrawable(-00000);
     popupWindow.setBackgroundDrawable(dw);
     // 显示 PopupWindow 的位置,参数一:父亲的 view,即底层 Activity 根布局的 id;参数二:显示的位置,如左上角;参数三:在参数二的基础上 x、y 坐标的偏移
     popupWindow.showAtLocation(findViewById(R.id.main), Gravity.LEFT|Gravity.TOP, 150, 200);
 }
 
隐藏 PopupWindow 的代码:
 
 popupWindow.dismiss();
 
38、Android ListView 的美化方法:
 
listview 在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来
       代码结解决 android:scrollingCache=”false”
 listview 的上边和下边有黑色的阴影
       代码解决:android:fadingEdge=”none”
 lsitview 的每一项之间需要设置一个图片做为间隔
       代码解决:  android:divider=”@drawable/list_driver”  其中  @drawable/list_driver 是一个图片资源
 自定义 listview 的时候,会出现下面选中一个空间黑色底色的情况,破坏整体美观度
       代码解决:android:cacheColorHint=“#00000000”
 默认显示选中的 item 为橙黄底色,有时候我们需要去掉这种效果
       代码解决:android:listSelector 属性.
 
39、
     在 AndroidManifest.xml 文件中设置 android:launchMode="singleInstance" ,可以保证栈中每个 Activity 只有一个实例,防止重复界面的不断加载。
     单纯的跳转页面时是可以处理的,但是跳转界面需要传值时就会出问题,这样处理只会将后台的 Activity 启动,传递的值是无法获取并重新加载的,
     如:ActivityA ——> ActivityB ——(搜索关键字)——> ActivityA    (当我从 ActivityB 传递关键字到 ActivityA 时,只是将栈底的 ActivityA 放在了栈顶,并不会做其他操作)
     如果既要保证每个 Activity 只有一个实例,又可以传递数据,可以在跳转界面的代码处加上下面一句话:
 
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
     这样处理,就是在跳转的时候将堆栈中该 Activity 前面的所有 Activity 都清除,并重新发 intent 将此 Activity 启动,因此就可以获取传递过来的数据进行相关处理。
 
40、线程问题:
 
The content of the adapter has changed but ListView did not receive a notification.
 Make sure the content of your adapter is not modified from a background thread, but only from the UI thread。
 解决问题的方法:
 
    这个错误经常出现在 Activity 休眠起来之后,主要还是使用 adapter 不太小心造成的,有时候我们获取数据都使用后台线程操作,
     当 Activity 休眠时,后台线程还在运行,唤醒 Activity 时再次操作该数据就会报这个错,原因就是数据在后台改变了但界面没有刷新。
     Activity 从休眠状态被唤醒时会调用 onResume () 方法,我们可以在 onResume () 方法中进行数据的刷新 notifyDataSetChanged,如下操作:
 
 @Override
 protected void onResume() {
     super.onResume();
     Log.e("onResume", "------------>onResume");
     // 这个错误经常出现在 Activity 休眠起来之后,休眠起来时会调用 onResume (), 调 notifyDataSetChanged 可以解决改问题
     if(securitiesAdapter != null){
         securitiesAdapter.notifyDataSetChanged();
     }
 }
 
41、保留小数点后两位:
 
 DecimalFormat formater = new DecimalFormat("#0.##");
 System.out.println(formater.format(123456.7897456));
 
42、判断耳机状态:
 
 public class ServiceReceiver extends BroadcastReceiver {
     public void onReceive(Context context, Intent intent) {
         if (Intent.ACTION_HEADSET_PLUG.equals(intent.getAction())) {
             try {
                 if (intent.getIntExtra("state", 0) == 0) {
                     Log.e("caculate broadcast", "headset off");
                     bHeadsetOn = false;
                 } else if (intent.getIntExtra("state", 0) == 1) {
                     Log.e("headset", "headset on");
                     bHeadsetOn = true;
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }
 }
 
43、异步任务调用时,先判断是否在运行,如果正在运行,则先取消该任务,然后再开启
 
 if(searchTask.getStatus() == AsyncTask.Status.RUNNING){
     searchTask.cancel(true);
 }
 searchTask = new SearchTask();
 searchByKey(sSearchKey);
 
44、黑屏后音频播放会有停顿的问题:
 
 PowerManager mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
 PowerManager.WakeLock mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "media");
 播放时:
 
 if (!mWakeLock.isHeld()){
     mWakeLock.acquire();
 }
 停止时:
 
 if (mWakeLock.isHeld()){
     mWakeLock.release();
 }
 
权限:
 
 <uses-permission android:name="android.permission.WAKE_LOCK"/>
 <uses-permission android:name="android.permission.DEVICE_POWER"/>  
 
45、当 ViewFlipper 与 touch 事件冲突时,ViewFlipper 的滑屏事件会被 touch 事件拦截,解决方法如下:
 
 public boolean onTouchEvent(MotionEvent event) {
     // 执行 touch 事件
     super.onTouchEvent(event);
     return this.detector.onTouchEvent(event);
 }
 // 这个方法会先执行,当返回为 true 时,才执行 onTouchEvent 方法
 public boolean dispatchTouchEvent(MotionEvent ev){
     // 先执行滑屏事件
     detector.onTouchEvent(ev);
     super.dispatchTouchEvent(ev);
     return true;
 }
 
46、
 查询图片,Uri 地址为:MediaStore.Images.Media.EXTERNAL_CONTENT_URI
 查询音乐,Uri 地址为:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
 
47、
 TextView 底部加横线:
 
 mTextView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);
 TextView 中间加横线:
 
 mTextView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);

AndroidManifest.xml 注意事项

AndroidManifest.xml 注意事项

一、target SDK version
Android Runtime 和 Dalvik 会根据 target SDK version 决定是否工作在『兼容模式』下,所谓兼容模式,就是关闭了新版本中各种新机制和体验优化的状态。targetSdkVersion 如果设置很低,就等于是关闭了所有高版本的新特性和机制,包括『屏幕自适应』、『硬件加速』。
为了保证各个版本的兼容性,及时使用到新特性,targetSdkVersion 因随 Android 最新版本的发布而持续提高,以保证在各个 Android 版本的设备上都能获得完整的体验。
Not targeting the latest versions of Android; compatibility modes apply. Consider testing and updating this version. Consult the android.os.Build.VERSION_CODES javadoc for details
二、<application> 中的 debuggable=”true”
当 debuggable 打开时,除了更易暴露在攻击之下,SDK tools(包括 ProGuard)也不会进行一些针对发布版本可以进行的优化,比如移除 dex 包中的代码调试信息(符号名、行号等),移除 DEBUG 和 VERBOSE 级别的日志输出。这些对 App 发布版本的容量和性能都有直接的影响。
Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one
三、 <uses-permission> 写在 < application > 之后
表面上看没有什么问题,但却埋下了一些 <application> 内部属性正确生效的隐患。
The <application> tag should appear after the elements which declare which version you need, which features you need, which libraries you need, and so on. In the past there have been subtle bugs (such as themes not getting applied correctly) when the <application> tag appears before some of these other elements, so it''s best to order your manifest in the logical dependency order
 

   我们经常在开发 app 的时候在 AndroidManifest.xml 发现这个警告 warining:"Not targeting the latest versions of Android; compatibility modes apply. Consider testing and  updating this version. Consult the android.os.Build.VERSION_CODES javadoc for details."

        Android Runtime 和 Dalvik 会根据 target SDK version 决定是否工作在『兼容模式』下,所谓兼容模式,就是关闭了新版本中各种新机制和体验优化的状态。targetSdkVersion 如果设置很低,就等于是关闭了所有高版本的新特性和机制,包括『屏幕自适应』、『硬件加速』。

 

        我的理解就是这个警告是在提醒我们没有匹配使用最新的 sdk 版本,可能导致 app 在最新的系统上面无法利用最新的特性或功能,去掉这个警告的办法就是把 uses-sdk 标签中的 android:targetSdkVersion 属性改为你电脑上面最新的 sdk 版本,例如我的电脑上最新的 sdk 是 android4.4,它的版本号是 19,那么我应该写成 “android:targetSdkVersion="19"”,这样就不会报错了,如果你电脑的 sdk 是 android4.0,那么改为 android:targetSdkVersion="14" 即可。

 

        当然,我们也可以无视这个警告,毕竟市场上的 android 系统版本还是要比开发 sdk 最新版本慢一段时间的,及时我们为高版本做了适配,也要等上一段时间才可能装载相应的 android 高版本手机上,所以我们可以将 android:targetSdkVersion 定为目前市场上最新或者普遍流行的高版本即可。

 


apache2 mod_proxy 注意事项

apache2 mod_proxy 注意事项

1。当重定向到本地 (localhost) 的某端口服务时,如 ProxyPass /redmine http://localhost:3000
一定要注意
1。那个软件系统的文件结构是不是相对路径,如果是,那么只能在 apache 的根网页目录下使用相应的软连接
2。如上事例所示,返回的 url 很可能没有 redmine,所以最好还是不要这么干,直接上子域名
我是指访问 myname.com/redmine 然后里面得链接全部都是 myname.com/project/...,如果上子域名就没这个问题
3。passenger (mod_rails) 真 TM 不好用

今天的关于Ubuntu 18.10 安装swift 注意事项ubuntu安装ss的分享已经结束,谢谢您的关注,如果想了解更多关于@Transactional spring 配置事务 注意事项、Android 注意事项 知识点、AndroidManifest.xml 注意事项、apache2 mod_proxy 注意事项的相关知识,请在本站进行查询。

本文标签: